springboot整合Dubbo與Feign的實(shí)現(xiàn)?(無注冊中心)
一,SpringBoot 整合 Dubbo
1.1 服務(wù)提供者
1.1.1 核心依賴
<!-- dubbo依賴 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency>
1.1.2 核心配置
server: port: 8081 spring: application: name: provide-api dubbo: registry: address: N/A # 表示無注冊中心 protocol: name: dubbo # 提供者協(xié)議 port: 18081 # 提供者dubbo端口 host: 127.0.0.1 # 服務(wù)提供者所在機(jī)器地址 scan: base-packages: com.paycools.service # 提供者需要交由dubbo管理的掃描包路徑 application: name: provide-server # 提供者服務(wù)名
1.1.3 服務(wù)提供者代碼結(jié)構(gòu)
1.1.4 服務(wù)提供者暴露的API(DubboDemoServiceImpl)
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 遠(yuǎn)程過程調(diào)用是否成功 */ @Override public String dubboTest() { log.info("########### 服務(wù)提供者成功提供API響應(yīng)"); return "服務(wù)提供者成功提供API響應(yīng)"; } /** * 用于測試 dubbo 的rpc 遠(yuǎn)程過程調(diào)用攜帶參數(shù)與返回值是否正常 */ @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("########### 服務(wù)提供者成功提供API響應(yīng),參數(shù)為{}, 返回值為{}", aa, list); return list; } log.info("########### 服務(wù)提供者成功提供API響應(yīng),參數(shù)為{}, 返回值為{}", aa, null); return null; } }
1.1.5 服務(wù)提供者端的對象(User)
一定要實(shí)現(xiàn)序列化!??!
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 { // 一定要序列化,因?yàn)閐ubbo傳輸數(shù)據(jù)以二進(jìn)制的方式 private String name; private int age; }
1.2 服務(wù)消費(fèi)者
1.2.1 核心依賴
與提供者端一樣
<!-- dubbo依賴 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>3.0.5</version> </dependency>
1.2.2 核心配置
server: port: 8082 spring: application: name: consumer-api dubbo: registry: address: N/A # 表示無注冊中心 #scan: # 作為提供者時(shí)使用 #base-packages: com.paycools.service # 掃描包的路徑 protocol: name: dubbo port: 18082 host: 127.0.0.1 application: name: consumer-server # 自定義配置--因無注冊中心,則需指定服務(wù)提供者地址 provide: host: "dubbo://127.0.0.1:18081"
1.2.3 服務(wù)消費(fèi)者代碼結(jié)構(gòu)
注意,本文中的 UserDemo 完全可以不需要,
可以直接在Controller中注入 IDubboDemoService
1.2.4 服務(wù)消費(fèi)者調(diào)用服務(wù)提供者
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(可省去此類,而直接調(diào)用提供者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}") // 無注冊中心時(shí)的參數(shù)配置 IDubboDemoService iDubboDemoService; public String demoTest() { return "### 服務(wù)消費(fèi)者成功拿到提供者的API響應(yīng):" + iDubboDemoService.dubboTest(); } public String demoVoTest(Integer aa) { return "### <帶參數(shù)以及對象返回值> 服務(wù)消費(fèi)者成功拿到提供者的API響應(yīng):" + iDubboDemoService.dubboVoTest(aa); } }
IDubboDemoService
包的路徑與名稱必須與服務(wù)提供者端的保持一致?。?!并且無需實(shí)現(xiàn)
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 { // 必須實(shí)現(xiàn)序列化 private String name; private int age; }
1.3 調(diào)用示例
1.3.1 消費(fèi)者入口(測試是否導(dǎo)通)
1.3.1.1 服務(wù)提供者端日志打印
2022-04-06 11:27:03.047 INFO 12284 --- [:18081-thread-6] c.p.service.impl.DubboDemoServiceImpl : ########### 服務(wù)提供者成功提供API響應(yīng)
1.3.2 消費(fèi)者入口(測試攜帶參數(shù)與返回值)
1.3.2.1 服務(wù)提供者端日志打印
2022-04-06 11:30:46.489 INFO 12284 --- [:18081-thread-9] c.p.service.impl.DubboDemoServiceImpl : ########### 服務(wù)提供者成功提供API響應(yīng),參數(shù)為0, 返回值為null
2022-04-06 11:30:58.910 INFO 12284 --- [18081-thread-10] c.p.service.impl.DubboDemoServiceImpl : ########### 服務(wù)提供者成功提供API響應(yīng),參數(shù)為1, 返回值為[User(name=張三, age=18), User(name=李四, age=5)]
1.4 小結(jié)
a. dubbo 服務(wù)提供者暴露的API,在服務(wù)消費(fèi)者中必須保持包名與文件名一致
b. dubbo 服務(wù)消費(fèi)者在注入API時(shí),要用到 @DubboReference 注解
c. dubbo 基于TCP傳輸協(xié)議,其對象都必須實(shí)現(xiàn)序列化
二, SpringBoot 整合 Feign
2.1 服務(wù)提供者
使用feign 的方式時(shí),服務(wù)提供者無需任何特殊處理,僅正常啟動程序即可
2.1.1 服務(wù)提供者基礎(chǔ)配置
server: port: 8083 spring: application: name: provide-server profiles: active: dev
2.1.2 服務(wù)提供者代碼結(jié)構(gòu)
2.2 服務(wù)消費(fèi)者
2.2.1 服務(wù)消費(fèi)者代碼結(jié)構(gòu)
2.2.2 核心依賴
<!-- 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>
2.2.3 核心配置
server: port: 8084 spring: application: name: consumer-server # 自定義配置,因無注冊中心,需直接指定服務(wù)提供者 provider: application-name: provide-server host: http://127.0.0.1:8083
2.2.4 啟動類注解
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("服務(wù)消費(fèi)者啟動成功..."); } }
2.2.5 在消費(fèi)者端中聲明提供者端的API
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); }
2.2.6 在消費(fèi)者端中調(diào)用提供者端的API
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("服務(wù)消費(fèi)者,成功調(diào)用服務(wù)提供者API"); return "服務(wù)消費(fèi)者端," + iProvideService.getProvideResponse(); } @RequestMapping(value = "/getProvideVoResponse/{id}", method = RequestMethod.GET) public String getProvideVoResponse(@PathVariable("id") Integer id) { log.info("服務(wù)消費(fèi)者,成功調(diào)用服務(wù)提供者API"); return "服務(wù)消費(fèi)者端," + iProvideService.getProvideVoResponse(id); } }
2.3 調(diào)用示例
2.3.1 測試是否導(dǎo)通
2.3.1.1 服務(wù)提供者端的日志打印
2022-04-06 11:56:46.472 INFO 4724 --- [nio-8083-exec-1] com.paycools.controller.UserController : 服務(wù)提供者, 成功通過feign的方式提供服務(wù)
2.3.1.2 服務(wù)消費(fèi)者端的日志打印
2022-04-06 11:56:46.399 INFO 3352 --- [nio-8084-exec-2] c.p.controller.ConsumerDemoController : 服務(wù)消費(fèi)者,成功調(diào)用服務(wù)提供者API
2.3.2 測試攜帶參數(shù)與獲取返回值是否正常
2.3.2.1 服務(wù)提供者端的日志打印
2022-04-06 12:01:14.588 INFO 4724 --- [nio-8083-exec-8] com.paycools.controller.UserController : 服務(wù)提供者, <帶有參數(shù)與返回值>成功通過feign的方式提供服務(wù), 參數(shù)為0,響應(yīng)為null
2022-04-06 12:02:51.754 INFO 4724 --- [nio-8083-exec-5] com.paycools.controller.UserController : 服務(wù)提供者, <帶有參數(shù)與返回值>成功通過feign的方式提供服務(wù), 參數(shù)為1,響應(yīng)為[User(id=1, name=王五, age=19), User(id=1, name=趙六, age=15)]
2.3.2.2 服務(wù)消費(fèi)者端的日志打印
2022-04-06 12:01:14.579 INFO 3352 --- [nio-8084-exec-3] c.p.controller.ConsumerDemoController : 服務(wù)消費(fèi)者,成功調(diào)用服務(wù)提供者API
2022-04-06 12:02:51.751 INFO 3352 --- [nio-8084-exec-8] c.p.controller.ConsumerDemoController : 服務(wù)消費(fèi)者,成功調(diào)用服務(wù)提供者API
2.4 小結(jié)
a. 服務(wù)提供者無需特殊操作
b. 服務(wù)消費(fèi)者端啟動類聲明注解
c. 服務(wù)消費(fèi)者端聲明服務(wù)提供者的API,然后調(diào)用時(shí)與本地API無異
到此這篇關(guān)于springboot整合Dubbo與Feign的實(shí)現(xiàn) (無注冊中心)的文章就介紹到這了,更多相關(guān)springboot整合Dubbo與Feign 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IntelliJ?IDEA設(shè)置JVM運(yùn)行參數(shù)的圖文介紹
這篇文章主要介紹了IntelliJ?IDEA設(shè)置JVM運(yùn)行參數(shù)的方法,包括配置方式及優(yōu)先級,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04SpringMVC通過RESTful結(jié)構(gòu)實(shí)現(xiàn)頁面數(shù)據(jù)交互
RESTFUL是一種網(wǎng)絡(luò)應(yīng)用程序的設(shè)計(jì)風(fēng)格和開發(fā)方式,基于HTTP,可以使用XML格式定義或JSON格式定義。RESTFUL適用于移動互聯(lián)網(wǎng)廠商作為業(yè)務(wù)接口的場景,實(shí)現(xiàn)第三方OTT調(diào)用移動網(wǎng)絡(luò)資源的功能,動作類型為新增、變更、刪除所調(diào)用資源2022-08-08java虛擬機(jī)原理:Class字節(jié)碼二進(jìn)制文件分析
class文件全名稱為Java class文件,主要在平臺無關(guān)性和網(wǎng)絡(luò)移動性方面使Java更適合網(wǎng)絡(luò)。它在平臺無關(guān)性方面的任務(wù)是:為Java程序提供獨(dú)立于底層主機(jī)平臺的二進(jìn)制形式的服務(wù)。下面我們來詳細(xì)解讀下它吧2021-09-09SpringMVC?RESTFul實(shí)體類創(chuàng)建及環(huán)境搭建
這篇文章主要為大家介紹了SpringMVC?RESTFul實(shí)體類創(chuàng)建及環(huán)境搭建詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Java兩種方法計(jì)算出階乘尾部連續(xù)0的個(gè)數(shù)
這篇文章主要介紹了Java兩種方法計(jì)算出階乘尾部連續(xù)0的個(gè)數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03