前提
最近創業公司的項目組基於業務需要,開發一套新的微服務,考慮到選用的組件必須是主流、社區活躍、生態完善以及方便遷移到雲上等因素,引入了SOFAStack
全家桶。微服務開發里面,一個很重要的功能就是服務發現與注冊,筆者花了點時間做了一個SOFABoot
、SOFARpc
結合Nacos
實現微服務發現注冊與遠程調用的示例。
依賴版本踩坑
筆者花了點時間去嘗試SOFABoot
、SOFARpc
結合Nacos
客戶端的依賴版本關系,截止本文編寫完成的時候(2020-01-01),sofaboot-dependencies
的最新版本為3.2.1
,對應於SOFABoot-3.2.1
、SOFARpc-5.6.3
和SpringBoot-2.1.x.RELEASE
。在這兩個最新版本的項目中,無論引入什么版本的nacos-clinet
,都沒有辦法向Nacos-Server
注冊服務信息。關於這一點,筆者曾經從Issues
里面查找相關的內容,暫時無果,於是把示例項目分享給社區的大佬進行分析,如果有解決方案,會在這篇博文中更新。試出來的可用的版本組合為:
sofaboot-dependencies:3.2.0
spring-boot-dependencies:2.1.0.RELEASE
nacos-api:0.6.0
和nacos-client:0.6.0
引入依賴如下:
<properties>
<sofa.boot.version>3.2.0</sofa.boot.version>
<spring.boot.version>2.1.0.RELEASE</spring.boot.version>
<nacos.version>0.6.0</nacos.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>sofaboot-dependencies</artifactId>
<version>${sofa.boot.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>healthcheck-sofa-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>rpc-sofa-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-api</artifactId>
<version>${nacos.version}</version>
</dependency>
</dependencies>
編寫服務提供方和服務消費方代碼
這里有一個前提,需要啟動一個Nacos-Server
,為了方便起見,使用單機模式本地啟動即可,那么服務注冊的地址就是http://127.0.0.1:8848
。示例項目的結構如下:
├─src
│ └─main
│ ├─java
│ │ └─club
│ │ └─throwable
│ │ ├─client
│ │ │ ClientApplication.java
│ │ │
│ │ ├─contract
│ │ │ HelloService.java
│ │ │
│ │ └─server
│ │ DefaultHelloService.java
│ │ ServerApplication.java
│ │
│ └─resources
│ application-client.properties
│ application-server.properties
其中contract
為契約包,可以提供給客戶端和服務端使用,client
包里面編寫客戶端(comsumer
)的代碼,而server
包里面編寫服務端(provider
)的代碼。
契約接口HelloService
很簡單:
public interface HelloService {
String sayHello(String name);
}
服務提供方需要實現此接口,實現類是DefaultHelloService
:
@Service
@SofaService(interfaceType = HelloService.class, bindings = {
@SofaServiceBinding(bindingType = "bolt")
})
public class DefaultHelloService implements HelloService {
@Override
public String sayHello(String name) {
return String.format("%s say hello!", name);
}
}
這里使用的服務協議綁定類型為bolt
,是官方示例建議的協議,當然還有dubbo
、http
等等,可以混合配置。接着編寫服務提供方啟動類ServerApplication
:
@SpringBootApplication(scanBasePackages = {"club.throwable.server", "club.throwable.contract"})
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
}
服務提供方應用的配置文件application-server.properties
如下:
spring.application.name=sofa-rpc-provider
server.port=9092
# 用Nacos做注冊中心
com.alipay.sofa.rpc.registry-address=nacos://127.0.0.1:8848
使用spring.profiles.active=server
啟動ServerApplication
,啟動成功后用瀏覽器打開Nacos-Console
:
可見目前sofa-rpc-provider
服務已經成功注冊到Nacos-Server
。接着編寫客戶端代碼,為了方便起見,所有的代碼編寫在啟動類ClientApplication
:
@Slf4j
@SpringBootApplication(scanBasePackages = {"club.throwable.client", "club.throwable.contract"})
public class ClientApplication implements CommandLineRunner {
@SofaReference(binding = @SofaReferenceBinding(bindingType = "bolt"))
private HelloService helloService;
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
log.info("調用HelloService#sayHello(),結果:{}", helloService.sayHello("throwable"));
}
}
服務消費方的配置文件application-client.properties
如下:
spring.application.name=sofa-rpc-consumer
server.port=9091
# 用Nacos做注冊中心
com.alipay.sofa.rpc.registry-address=nacos://127.0.0.1:8848
使用spring.profiles.active=client
啟動ClientApplication
,啟動完成后控制台輸出:
2020-01-02 17:07:58.782 INFO 2900 --- [main] club.throwable.client.ClientApplication : 調用HelloService#sayHello(),結果:throwable say hello!
基本原理如下:
小結
SOFABoot
、SOFARpc
底層依賴於Spring
容器,可以跟隨SpringBoot
版本迭代升級,底層通訊使用Netty
,在性能上有保障,而且真正做到了兼容HTTP
、Dubbo
、Service Mesh
(后面應該會把Service Mesh
作為通訊協議進行兼容)等等協議,對於開發者而言相對友好,學習成本低,做到真正的開箱添加少量配置即可使用。除了目前發現依賴版本的問題,暫時沒有大的坑,嘗嘗鮮的感覺還是挺不錯的。
示例項目:
原文鏈接
- 個人博客【Github Page】:http://throwable.club/2020/01/01/sofa-boot-nacos-get-start
- 個人博客【Coding Page】:http://throwable.coding.me/2020/01/01/sofa-boot-nacos-get-start
(本文完 c-1-d e-a-20200101)
技術公眾號(《Throwable文摘》),不定期推送筆者原創技術文章(絕不抄襲或者轉載):