SofaBoot使用Nacos进行服务注册发现
前提
最近创业公司的项目组基于业务需要,开发一套新的微服务,考虑到选用的组件必须是主流、社区活跃、生态完善以及方便迁移到云上等因素,引入了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.0spring-boot-dependencies:2.1.0.RELEASEnacos-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)
SofaBoot使用Nacos进行服务注册发现的更多相关文章
- spring cloud微服务快速教程之(七) Spring Cloud Alibaba--nacos(一)、服务注册发现
0.前言 什么是Spring Cloud Alibaba? Spring Cloud Alibaba 是阿里开源的,致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便 ...
- Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现
自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注.虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭 ...
- nacos 的服务注册与发现
nacos的服务注册于发现. 这个要求服务统一注册到注册中心,然后调用的时候就不需要通过ip来调用,直接通过服务名即可. 服务提供者 pom.xml配置,需要spring-cloud-starter- ...
- 服务注册发现与注册中心对比-Eureka,Consul,Zookeeper,Nacos对比
服务注册发现与注册中心对比-Eureka,Consul,Zookeeper,Nacos对比 注册中心简介 流程和原理 基础流程 核心功能 1.Eureka.Consul.Zookeeper三者异同点 ...
- Spring Cloud Alibaba系列(一)nacos作为服务注册中心
Spring Cloud Alibaba各组件版本关系 Spring Cloud Alibaba Version Sentinel Version Nacos Version RocketMQ Ver ...
- Consul 多数据中心下的服务注册发现与配置共享
1. Consul简介 Consul是HashiCorp公司推出的开源软件,它提供了一套分布式高可用可横向扩展的解决方案,能为微服务提供服务治理.健康检查.配置共享等能力. Eurake2.x ...
- Spring Cloud Alibaba 使用Nacos作为服务注册中心
为什么需要注册中心? 在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用:服务管理,核心是有个服务注册表,心跳机制动态维护 : 服务注册 创建普通Spring ...
- Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****
http://www.idouba.net/spring-cloud-source-eureka-client-api/?utm_source=tuicool&utm_medium=refer ...
- 服务注册发现consul之二:在Spring Cloud中使用Consul实现服务的注册和发现
首先安装consul环境,参照之前的文章:<服务注册发现consul之一:consul介绍及安装>中的第一节介绍. Spring Cloud使用Consul的服务与发现 1.导入依赖pri ...
随机推荐
- 使用Laravel5做权限管理
https://www.imooc.com/article/18250 关于权限管理的思考 最近在用laravel设计后台,后台需要有个权限管理.权限管理实质上分为两个部分,首先是认证,然后是权限.认 ...
- laravel多表登录出现路由调用错误
public function auth() { // Authentication Routes... $this->get('login', 'Auth\LoginController@sh ...
- 20190528-JavaScriptの打怪升级旅行 { 语句 [ 赋值 ,数据 ] }
写在前面的乱七八糟:今天考了试,emmm很基础的题,还是Mrs房的面试题让人绝望啊┓( ´∀` )┏,补了很多知识,很综合的题,坑也很多,总的来说,查漏补缺,其实是啥都缺~ 今天打的小BOSS主要是数 ...
- hdu 5723 Abandoned country(2016多校第一场) (最小生成树+期望)
Abandoned country Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- oracle 用EXISTS替代IN
在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 低效: SELECT * FROM EMP ( ...
- 弹性FLEX布局
页面布局一直都是web应用样式设计的重点 我们传统的布局方式都是基于盒模型的 利用display.position.float来布局有一定局限性 比如说实现自适应垂直居中 随着响应式布局的流行,CSS ...
- Python:pip 和pip3的区别
前言 装完python3后发现库里面既有pip也有pip3,不知道它们的区别,因此特意去了解了一下. 解释 先搜索了一下看到了如下的解释, 安装了python3之后,库里面既会有pip3也会有pip ...
- HDU1686 Oulipo 题解 KMP算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686 题目大意:给你一个子串t和一个母串s,求s中有多少个子串t. 题目分析:KMP模板题. cal_ ...
- CSS3 Box-shadow 阴影效果用法
一.基本用法: 二.内阴影用法: 三.阴影扩展长度值: box-shadow: 4rpx 4rpx 8rpx #aaa;
- NLP --- 条件随机场CRF详解 重点 特征函数 转移矩阵
上一节我们介绍了CRF的背景,本节开始进入CRF的正式的定义,简单来说条件随机场就是定义在隐马尔科夫过程的无向图模型,外加可观测符号X,这个X是整个可观测向量.而我们前面学习的HMM算法,默认可观测符 ...