<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
<!-- dubbo依賴 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency>
server: port: 8081 spring: application: name: provide-api dubbo: registry: address: N/A # 表示無註冊中心 protocol: name: dubbo # 提供者協定 port: 18081 # 提供者dubbo埠 host: 127.0.0.1 # 服務提供者所在機器地址 scan: base-packages: com.paycools.service # 提供者需要交由dubbo管理的掃描包路徑 application: name: provide-server # 提供者服務名
package com.jxz.service.impl; import com.jxz.service.IDubboDemoService; import com.jxz.service.vo.User; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; /** * @author jiangXueZhi * @data 2022/4/1 */ @Service // spring 的註解 @DubboService // dubbo 提供者的註解 @Slf4j public class DubboDemoServiceImpl implements IDubboDemoService { /** * 用於測試 dubbo 的rpc 遠端過程呼叫是否成功 */ @Override public String dubboTest() { log.info("########### 服務提供者成功提供API響應"); return "服務提供者成功提供API響應"; } /** * 用於測試 dubbo 的rpc 遠端過程呼叫攜帶引數與返回值是否正常 */ @Override public List<User> dubboVoTest(Integer aa) { if (aa == 1) { List<User> list = new ArrayList<>(3); list.add(new User().setName("張三").setAge(18)); list.add(new User().setName("李四").setAge(5)); log.info("########### 服務提供者成功提供API響應,引數為{}, 返回值為{}", aa, list); return list; } log.info("########### 服務提供者成功提供API響應,引數為{}, 返回值為{}", aa, null); return null; } }
一定要實現序列化!!!
package com.jxz.service.vo; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; /** * @author jiangXueZhi * @data 2022/4/2 */ @Data @Accessors(chain = true) public class User implements Serializable { // 一定要序列化,因為dubbo傳輸資料以二進位制的方式 private String name; private int age; }
與提供者端一樣
<!-- dubbo依賴 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency>
server: port: 8082 spring: application: name: consumer-api dubbo: registry: address: N/A # 表示無註冊中心 #scan: # 作為提供者時使用 #base-packages: com.paycools.service # 掃描包的路徑 protocol: name: dubbo port: 18082 host: 127.0.0.1 application: name: consumer-server # 自定義設定--因無註冊中心,則需指定服務提供者地址 provide: host: "dubbo://127.0.0.1:18081"
注意,本文中的 UserDemo 完全可以不需要,
可以直接在Controller中注入 IDubboDemoService
controller
package com.jxz.controller; import com.jxz.service.UserDemo; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * @author jiangXueZhi * @data 2022/4/1 */ @RequestMapping("/api") @RestController public class DemoTestController { @Resource private UserDemo userDemo; @RequestMapping(value = "/demoTest", method = RequestMethod.GET) public String demoTest() { return userDemo.demoTest(); } @RequestMapping(value = "/demoVoTest/{aa}", method = RequestMethod.GET) public String demoVoTest(@PathVariable("aa") Integer aa) { return userDemo.demoVoTest(aa); } }
userDemo(可省去此類,而直接呼叫提供者API)
package com.jxz.service; import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.stereotype.Service; /** * @author jiangXueZhi * @data 2022/4/1 */ @Service public class UserDemo { @DubboReference(check = false, url = "${provide.host}") // 無註冊中心時的引數設定 IDubboDemoService iDubboDemoService; public String demoTest() { return "### 服務消費者成功拿到提供者的API響應:" + iDubboDemoService.dubboTest(); } public String demoVoTest(Integer aa) { return "### <帶引數以及物件返回值> 服務消費者成功拿到提供者的API響應:" + iDubboDemoService.dubboVoTest(aa); } }
IDubboDemoService
包的路徑與名稱必須與服務提供者端的保持一致!!!並且無需實現
package com.jxz.service; import com.paycools.service.pojo.User; import java.util.List; public interface IDubboDemoService { String dubboTest(); List<User> dubboVoTest(Integer aa); }
User
package com.jxz.service.pojo; import lombok.Data; import java.io.Serializable; /** * @author jiangXueZhi * @data 2022/4/2 */ @Data public class User implements Serializable { // 必須實現序列化 private String name; private int age; }
1.3.1.1 服務提供者端紀錄檔列印
2022-04-06 11:27:03.047 INFO 12284 --- [:18081-thread-6] c.p.service.impl.DubboDemoServiceImpl : ########### 服務提供者成功提供API響應
1.3.2.1 服務提供者端紀錄檔列印
2022-04-06 11:30:46.489 INFO 12284 --- [:18081-thread-9] c.p.service.impl.DubboDemoServiceImpl : ########### 服務提供者成功提供API響應,引數為0, 返回值為null
2022-04-06 11:30:58.910 INFO 12284 --- [18081-thread-10] c.p.service.impl.DubboDemoServiceImpl : ########### 服務提供者成功提供API響應,引數為1, 返回值為[User(name=張三, age=18), User(name=李四, age=5)]
a. dubbo 服務提供者暴露的API,在服務消費者中必須保持包名與檔名一致
b. dubbo 服務消費者在注入API時,要用到 @DubboReference 註解
c. dubbo 基於TCP傳輸協定,其物件都必須實現序列化
使用feign 的方式時,服務提供者無需任何特殊處理,僅正常啟動程式即可
server: port: 8083 spring: application: name: provide-server profiles: active: dev
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>3.1.1</version> </dependency>
server: port: 8084 spring: application: name: consumer-server # 自定義設定,因無註冊中心,需直接指定服務提供者 provider: application-name: provide-server host: http://127.0.0.1:8083
package com.jxz; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableFeignClients public class FeignConsumerDemoApplication { public static void main(String[] args) { SpringApplication.run(FeignConsumerDemoApplication.class, args); System.out.println("服務消費者啟動成功..."); } }
package com.paycools.service; import com.paycools.pojo.User; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; @FeignClient(value = "${provider.application-name}", url = "${provider.host}") // 因無註冊中心,需直接指定其url public interface IProvideService { @RequestMapping("/api/provide/getProvideResponse") String getProvideResponse(); @RequestMapping("/api/provide/getProvideVoResponse/{id}") List<User> getProvideVoResponse(@PathVariable("id") Integer id); }
package com.jxz.controller; import com.jxz.service.IProvideService; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * @author jiangXueZhi * @data 2022/4/2 */ @RestController @RequestMapping("/api/consumer") @Slf4j public class ConsumerDemoController { @Resource private IProvideService iProvideService; @RequestMapping("/getProvideResponse") public String getProvideResponse() { log.info("服務消費者,成功呼叫服務提供者API"); return "服務消費者端," + iProvideService.getProvideResponse(); } @RequestMapping(value = "/getProvideVoResponse/{id}", method = RequestMethod.GET) public String getProvideVoResponse(@PathVariable("id") Integer id) { log.info("服務消費者,成功呼叫服務提供者API"); return "服務消費者端," + iProvideService.getProvideVoResponse(id); } }
2.3.1.1 服務提供者端的紀錄檔列印
2022-04-06 11:56:46.472 INFO 4724 --- [nio-8083-exec-1] com.paycools.controller.UserController : 服務提供者, 成功通過feign的方式提供服務
2.3.1.2 服務消費者端的紀錄檔列印
2022-04-06 11:56:46.399 INFO 3352 --- [nio-8084-exec-2] c.p.controller.ConsumerDemoController : 服務消費者,成功呼叫服務提供者API
2.3.2 測試攜帶引數與獲取返回值是否正常
2.3.2.1 服務提供者端的紀錄檔列印
2022-04-06 12:01:14.588 INFO 4724 --- [nio-8083-exec-8] com.paycools.controller.UserController : 服務提供者, <帶有引數與返回值>成功通過feign的方式提供服務, 引數為0,響應為null
2022-04-06 12:02:51.754 INFO 4724 --- [nio-8083-exec-5] com.paycools.controller.UserController : 服務提供者, <帶有引數與返回值>成功通過feign的方式提供服務, 引數為1,響應為[User(id=1, name=王五, age=19), User(id=1, name=趙六, age=15)]
2.3.2.2 服務消費者端的紀錄檔列印
2022-04-06 12:01:14.579 INFO 3352 --- [nio-8084-exec-3] c.p.controller.ConsumerDemoController : 服務消費者,成功呼叫服務提供者API
2022-04-06 12:02:51.751 INFO 3352 --- [nio-8084-exec-8] c.p.controller.ConsumerDemoController : 服務消費者,成功呼叫服務提供者API
a. 服務提供者無需特殊操作
b. 服務消費者端啟動類宣告註解
c. 服務消費者端宣告服務提供者的API,然後呼叫時與本地API無異
到此這篇關於springboot整合Dubbo與Feign的實現 (無註冊中心)的文章就介紹到這了,更多相關springboot整合Dubbo與Feign 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45