前言
這段時間在接觸分布式的內容,由於本身比較熟悉rpc的原理,所以我順其自然地選擇了 dubbo 作為我學習的框架。
看了任務清單,這篇文章應該是在6天前出來的,但是因為實習等等的一些事情耽誤了,今天立下決心動筆了。
准備
必需
JAVA 環境
注冊中心(我選用的是 nacos )非必需
Maven
docker
idea(這個應該是必需的?當然也可以用記事本(滑稽.jpg))
正文
- 新建普通的 maven 項目(不勾選任何選項),手動寫入 pom 文件,配置項如下
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
其實也可以不要 lombok ,此處只是方便調試。
- 新建三個module,分別命名為 api,provider,consumer
- 模塊作用
api -- 普通 maven 項目,用於定義provider以及consumer交互的接口以及規范
provider -- Spring Boot 本地項目,用於為 api 中定義的服務接口創建實體類
consumer -- Spring Boot web 項目,接收用戶請求,調用 provider 處理請求並返回結果
-
模塊pom定義
- 根項目新增
<modules> <module>api</module> <module>provider</module> <module>consumer</module> </modules>
- api 新增
<version>0.0.1-SNAPSHOT</version>
- consumer 新增
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com</groupId> <artifactId>api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.0.0</version> </dependency> </dependencies>
- provider 新增
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com</groupId> <artifactId>api</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.0.0</version> </dependency> </dependencies>
-
模塊配置文件
- provider 配置文件
dubbo: registry: address: nacos://192.168.99.100:8848 application: name: dubbo-provider
- consumer 配置文件
spring: application: name: dubbo-consumer cloud: nacos: discovery: server-addr: 192.168.99.100 server: port: 8081 servlet: context-path: /text dubbo: protocol: port: -1 name: dubbo registry: address: nacos://192.168.99.100:8848 cloud: subscribed-services: dubbo-spring-cloud-provider application: name: consumer
- 示例搭建(Hello World)
- 接口 HelloService 構建
package com.api;
public interface HelloService {
String say(String name);
}
- 服務提供類實現
package com.producer;
import com.api.HelloService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Service
@Component
public class HelloServiceImp implements HelloService {
@Override
public String say(String name) {
return "hello,"+name;
}
}
注意:@Service 注解是 dubbo 的注解,不是 Spring 的注解
- 服務提供者啟動類添加@EnableDubbo注解
@SpringBootApplication
@EnableDubbo
public class DubboProducerApplication {
public static void main(String[] args) {
SpringApplication.run(DubboProducerApplication.class, args);
}
}
- 消費者實現
package com.consumer;
import com.api.HelloService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class TextController {
@Reference
private HelloService helloService;
@GetMapping("/text")
public String text(){
return helloService.say("cartoon");
}
}
dubbo 的服務消費應該在消費者中的 Service 層做整合消費后返回處理結果,這里僅為演示。
- 運行
先運行 provider 再運行 consumer,否則 dubbo 會因無法找到服務提供者自行關閉消費者。
- nacos 的結果
- 插件 RestServices 的模擬調用
后記
雖然在網上已經有很多這方面的教程,但是大多是用 zookeeper 作為注冊中心。
而個人喜歡接觸新技術,nacos 在今年1月才由阿里開源出來。而且我比較喜歡 nacos 的界面風格,雖然 nacos 在功能上不如 zookeeper+dubboAdmin 強大,但是作為入門應該是足夠的。
在我的任務清單上,還規划着 dubbo 的 spi 機制的全注解輔以配置文件使用文章,但是因為時間以及我對機制還沒深入理解,所以我將這篇文章押后了,等深入源碼之后再根據源碼寫出我想要的文章。
本文首發於cartoon的博客
轉載請注明出處:https://cartoonyu.github.io/cartoon-blog/post/dubbo/dubbo與springboot的結合/