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ù)提供者端的對(duì)象(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ù)以及對(duì)象返回值> 服務(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é)議,其對(duì)象都必須實(shí)現(xiàn)序列化
二, SpringBoot 整合 Feign
2.1 服務(wù)提供者
使用feign 的方式時(shí),服務(wù)提供者無需任何特殊處理,僅正常啟動(dòng)程序即可
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:80832.2.4 啟動(dòng)類注解
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)者啟動(dòng)成功...");
}
}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)者端啟動(dòng)類聲明注解
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)文章
Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之哈希算法實(shí)現(xiàn)
哈希表本質(zhì)是一種(key,value)結(jié)構(gòu),由此我們可以聯(lián)想到,能不能把哈希表的key映射成數(shù)組的索引index呢?如果這樣做的話那么查詢相當(dāng)于直接查詢索引,查詢時(shí)間復(fù)雜度為O(1),其實(shí)這也正是當(dāng)key為int型時(shí)的做法,將key通過某種做法映射成index,從而轉(zhuǎn)換成數(shù)組結(jié)構(gòu)2022-02-02
利用spring-boot-maven-plugin插件打包SpringBoot應(yīng)用方式
spring-boot-maven-plugin插件可以將SpringBoot應(yīng)用打成帶依賴的jar包,該包中不僅包含應(yīng)用自身的代碼,還包含了pom.xml中配置的依賴,修改pom.xml打包后,生成的jar包就包含了項(xiàng)目依賴,生成的jar包位于項(xiàng)目的target文件夾下2025-02-02
IDEA maven項(xiàng)目中刷新依賴的兩種方法小結(jié)
這篇文章主要介紹了IDEA maven項(xiàng)目中刷新依賴的兩種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Java RabbitMQ的工作隊(duì)列與消息應(yīng)答詳解
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
Java如何使用httpclient檢測url狀態(tài)及鏈接是否能打開
這篇文章主要介紹了Java如何使用httpclient檢測url狀態(tài)及鏈接是否能打開,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Mybatis如何實(shí)現(xiàn)@Select等注解動(dòng)態(tài)組合SQL語句
這篇文章主要介紹了Mybatis如何實(shí)現(xiàn)@Select等注解動(dòng)態(tài)組合SQL語句,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07

