基於Springboot+Dubbo+Nacos 註解方式實現微服務呼叫
1 專案結構
|-- spring-boot-dubbo-demo (父級工程)
|-- spring-boot-dubbo-base (基礎工程)
|-- spring-boot-dubbo-consumer (消費者)
|-- spring-boot-dubbo-provider (生產者)
SpringBoot版本:2.2.0
Dubbo版本:2.7.0
Nacos版本:1.1.4
2 啟動Nacos註冊中心
Nacos官方文件:
https://nacos.io/zh-cn/docs/quick-start.html
預設賬號密碼是nacos
3 搭建專案
Consumer和Provider的Maven依賴如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Base依賴 -->
<dependency>
<groupId>com.sans</groupId>
<artifactId>spring-boot-dubbo-base</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- Dubbo依賴 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.0</version>
</dependency>
<!-- Nacos依賴 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>2.7.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
Consumer配置如下:
# 配置埠
server:
port: 8862
dubbo:
# 配置服務資訊
application:
name: dubbo-consumer
# 禁用QOS同一臺機器可能會有埠衝突現象
qos-enable: false
qos-accept-foreign-ip: false
# 配置註冊中心
registry:
address: nacos://127.0.0.1:8848
# 設定超時時間
consumer:
timeout: 4000
spring:
main:
# 解決Bean重複定義問題
allow-bean-definition-overriding: true
Provider配置如下:
# 配置埠
server:
port: 8861
dubbo:
# 配置服務資訊
application:
name: dubbo-provider
# 禁用QOS同一臺機器可能會有埠衝突現象
qos-enable: false
qos-accept-foreign-ip: false
# 配置註冊中心
registry:
address: nacos://127.0.0.1:8848
# 設定協議-協議由提供方指定消費方被動接受
protocol:
name: dubbo
port: 20880
spring:
main:
# 解決Bean重複定義問題
allow-bean-definition-overriding: true
4 Base工程編寫
編寫DTO
/**
* RPC介面DTO
* 注意這裡要實現序列化介面
* @Author springRoot
* @CreateTime 2019/11/6 23:04
*/
@Data
public class ProviderTestDTO implements Serializable {
// ID
private int id;
// 名字
private String name;
// 序號
private Integer number;
}
編寫Serivce
/**
* RPC介面
* @Author springRoot
* @CreateTime 2019/11/6 23:03
*/
public interface IProviderService {
List<ProviderTestDTO> queryList();
}
編寫返回結果類
/**
* 返回結果類
* 這裡採用構建者模式構建
* 優點:1.私有化構造器訪問範圍小 2.引數可靈活設定便於管理
* @Author springRoot
* @CreateTime 2019/11/7 18:59
*/
@Getter
public class ResultVO<T> implements Serializable {
/**
* 返回碼
*/
private int code;
/**
* 返回資訊
*/
private String message;
/**
* 返回資料
*/
private T data;
/** 私有化構造器 **/
private ResultVO() {}
private ResultVO(ResultVO<T> resultVO) {
this.code = resultVO.code;
this.message = resultVO.message;
this.data = resultVO.data;
}
/**
* Build
*/
public static class Builder<T>{
private ResultVO<T> resultVO;
public Builder() {
resultVO = new ResultVO<>();
}
public Builder code(int code){
resultVO.code = code;
return this;
}
public Builder message(String message){
resultVO.message = message;
return this;
}
public Builder data(T data){
resultVO.data = data;
return this;
}
public ResultVO<T> build(){
return new ResultVO<>(resultVO);
}
}
}
5 Provider工程編寫
在啟動類上面不要忘記加上@EnableDubbo註解
@EnableDubbo //開啟Dubbo的註解支援
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
實現IProviderService介面,注意這裡的Serivce引用的是dubbo的包
/**
* 生產者Dubbo介面實現
* @Author springRoot
* @CreateTime 2019/11/6 23:01
*/
@Service
public class ProviderServiceImpl implements IProviderService {
@Override
public List<ProviderTestDTO> queryList() {
// 初始化資料
ProviderTestDTO testDTO1 = new ProviderTestDTO();
testDTO1.setId(1);
testDTO1.setName("學生");
testDTO1.setNumber(100);
ProviderTestDTO testDTO2 = new ProviderTestDTO();
testDTO2.setId(2);
testDTO2.setName("教師");
testDTO2.setNumber(101);
// 組裝資料
List<ProviderTestDTO> list = new ArrayList<>();
list.add(testDTO1);
list.add(testDTO2);
return list;
}
}
6 Consumer工程編寫
和Provider工程的啟動類一樣,加上@EnableDubbo註解
@EnableDubbo //開啟dubbo的註解支援
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
編寫測試介面
/**
* 消費測試介面
* @Author springRoot
* @CreateTime 2019/11/6 23:09
*/
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
// Dubbo遠端呼叫註解
@Reference
private IProviderService providerService;
@RequestMapping(value = "/list",method = RequestMethod.GET)
public ResultVO getList(){
// 遠端呼叫
List<ProviderTestDTO> providerTestDTOList = providerService.queryList();
return new ResultVO.Builder<>().code(200).message("success").data(providerTestDTOList).build();
}
}
7 測試
啟動Provider工程和Consumer工程,這個時候Nacos會有對應的服務
使用Postman訪問Consumer測試介面
相關文章
- 基於OpenTelemetry實現Java微服務呼叫鏈跟蹤Java微服務
- spring基於註解配置實現事務控制Spring
- Eureka實現微服務的呼叫微服務
- 微服務~Eureka實現的服務註冊與發現及服務之間的呼叫微服務
- Eureka-實現微服務的呼叫微服務
- 微服務學習小結-Eureka如何實現註冊中心,以及服務之間的註冊、呼叫微服務
- go基於grpc構建微服務框架-服務註冊與發現GoRPC微服務框架
- 3個註解,優雅的實現微服務鑑權微服務
- Spring Aop基於註解的實現Spring
- 基於JWT規範實現的認證微服務JWT微服務
- 基於註解的 PHP 列舉類實現PHP
- SpringBoot基於註解方式配置FilterSpring BootFilter
- Spring Cloud微服務-基於Eureka的feign呼叫(1)SpringCloud微服務
- 請問為什麼越來越多的技術偏向於基於註解的實現方式?
- 微服務之間的呼叫方式哪種最佳?微服務
- 微服務5:服務註冊與發現(實踐篇)微服務
- Spring中基於註解方式的AOP操作Spring
- 【Spring Cloud】Eureka實現微服務釋出與呼叫SpringCloud微服務
- Spring 註解方式實現的AOPSpring
- 基於Golang的微服務——Micro實踐(一)Golang微服務
- 基於Golang的微服務——Micro實踐(二)Golang微服務
- spring和ehcache整合,實現基於註解的快取實現Spring快取
- Spring Cloud+ Eureka微服務基礎專案搭建(已實現呼叫增刪改查微服務,持續更新)SpringCloud微服務
- 微服務架構 | 4.2 基於 Feign 與 OpenFeign 的服務介面呼叫微服務架構
- 基於Spring Boot和Spring Cloud實現微服務架構Spring BootCloud微服務架構
- 微服務4:服務註冊與發現微服務
- 【微服務之Eureka服務註冊發現】微服務
- 實現微服務預熱呼叫之後再開始服務(上)微服務
- 實現微服務預熱呼叫之後再開始服務(下)微服務
- Mybatis基於註解的方式訪問資料庫MyBatis資料庫
- 教你玩轉微服務--基於DDD的微服務架構落地實踐之路微服務架構
- 基於容器雲的微服務架構實踐微服務架構
- 微服務之服務註冊和服務發現篇微服務
- 聊聊微服務的服務註冊與發現!微服務
- 基於微服務框架Micronaut和Eventuate Tram實現分散式事務的開源案例微服務框架分散式
- 基於graphql的微服務基礎框架微服務框架
- java-Mybatis 註解方式實現sql語句JavaMyBatisSQL
- 難住了,微服務之間的呼叫方式哪種更優?微服務