SofaBoot使用Nacos進行服務注冊發現


前提

最近創業公司的項目組基於業務需要,開發一套新的微服務,考慮到選用的組件必須是主流、社區活躍、生態完善以及方便遷移到雲上等因素,引入了SOFAStack全家桶。微服務開發里面,一個很重要的功能就是服務發現與注冊,筆者花了點時間做了一個SOFABootSOFARpc結合Nacos實現微服務發現注冊與遠程調用的示例。

依賴版本踩坑

筆者花了點時間去嘗試SOFABootSOFARpc結合Nacos客戶端的依賴版本關系,截止本文編寫完成的時候(2020-01-01),sofaboot-dependencies的最新版本為3.2.1,對應於SOFABoot-3.2.1SOFARpc-5.6.3SpringBoot-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.0nacos-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,是官方示例建議的協議,當然還有dubbohttp等等,可以混合配置。接着編寫服務提供方啟動類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!

基本原理如下:

小結

SOFABootSOFARpc底層依賴於Spring容器,可以跟隨SpringBoot版本迭代升級,底層通訊使用Netty,在性能上有保障,而且真正做到了兼容HTTPDubboService Mesh(后面應該會把Service Mesh作為通訊協議進行兼容)等等協議,對於開發者而言相對友好,學習成本低,做到真正的開箱添加少量配置即可使用。除了目前發現依賴版本的問題,暫時沒有大的坑,嘗嘗鮮的感覺還是挺不錯的。

示例項目:

原文鏈接

(本文完 c-1-d e-a-20200101)

技術公眾號(《Throwable文摘》),不定期推送筆者原創技術文章(絕不抄襲或者轉載):


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM