前提

最近创业公司的项目组基于业务需要,开发一套新的微服务,考虑到选用的组件必须是主流、社区活跃、生态完善以及方便迁移到云上等因素,引入了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)

SofaBoot使用Nacos进行服务注册发现的更多相关文章

  1. spring cloud微服务快速教程之(七) Spring Cloud Alibaba--nacos(一)、服务注册发现

    0.前言 什么是Spring Cloud Alibaba? Spring Cloud Alibaba 是阿里开源的,致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便 ...

  2. Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

    自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注.虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭 ...

  3. nacos 的服务注册与发现

    nacos的服务注册于发现. 这个要求服务统一注册到注册中心,然后调用的时候就不需要通过ip来调用,直接通过服务名即可. 服务提供者 pom.xml配置,需要spring-cloud-starter- ...

  4. 服务注册发现与注册中心对比-Eureka,Consul,Zookeeper,Nacos对比

    服务注册发现与注册中心对比-Eureka,Consul,Zookeeper,Nacos对比 注册中心简介 流程和原理 基础流程 核心功能 1.Eureka.Consul.Zookeeper三者异同点 ...

  5. Spring Cloud Alibaba系列(一)nacos作为服务注册中心

    Spring Cloud Alibaba各组件版本关系 Spring Cloud Alibaba Version Sentinel Version Nacos Version RocketMQ Ver ...

  6. Consul 多数据中心下的服务注册发现与配置共享

    1. Consul简介   Consul是HashiCorp公司推出的开源软件,它提供了一套分布式高可用可横向扩展的解决方案,能为微服务提供服务治理.健康检查.配置共享等能力.   Eurake2.x ...

  7. Spring Cloud Alibaba 使用Nacos作为服务注册中心

    为什么需要注册中心? 在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用:服务管理,核心是有个服务注册表,心跳机制动态维护 : 服务注册 创建普通Spring ...

  8. Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****

    http://www.idouba.net/spring-cloud-source-eureka-client-api/?utm_source=tuicool&utm_medium=refer ...

  9. 服务注册发现consul之二:在Spring Cloud中使用Consul实现服务的注册和发现

    首先安装consul环境,参照之前的文章:<服务注册发现consul之一:consul介绍及安装>中的第一节介绍. Spring Cloud使用Consul的服务与发现 1.导入依赖pri ...

随机推荐

  1. 使用Laravel5做权限管理

    https://www.imooc.com/article/18250 关于权限管理的思考 最近在用laravel设计后台,后台需要有个权限管理.权限管理实质上分为两个部分,首先是认证,然后是权限.认 ...

  2. laravel多表登录出现路由调用错误

    public function auth() { // Authentication Routes... $this->get('login', 'Auth\LoginController@sh ...

  3. 20190528-JavaScriptの打怪升级旅行 { 语句 [ 赋值 ,数据 ] }

    写在前面的乱七八糟:今天考了试,emmm很基础的题,还是Mrs房的面试题让人绝望啊┓( ´∀` )┏,补了很多知识,很综合的题,坑也很多,总的来说,查漏补缺,其实是啥都缺~ 今天打的小BOSS主要是数 ...

  4. hdu 5723 Abandoned country(2016多校第一场) (最小生成树+期望)

    Abandoned country Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  5. oracle 用EXISTS替代IN

    在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 低效: SELECT * FROM EMP ( ...

  6. 弹性FLEX布局

    页面布局一直都是web应用样式设计的重点 我们传统的布局方式都是基于盒模型的 利用display.position.float来布局有一定局限性 比如说实现自适应垂直居中 随着响应式布局的流行,CSS ...

  7. Python:pip 和pip3的区别

    前言 装完python3后发现库里面既有pip也有pip3,不知道它们的区别,因此特意去了解了一下. 解释 先搜索了一下看到了如下的解释, 安装了python3之后,库里面既会有pip3也会有pip ...

  8. HDU1686 Oulipo 题解 KMP算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686 题目大意:给你一个子串t和一个母串s,求s中有多少个子串t. 题目分析:KMP模板题. cal_ ...

  9. CSS3 Box-shadow 阴影效果用法

    一.基本用法: 二.内阴影用法: 三.阴影扩展长度值: box-shadow: 4rpx 4rpx 8rpx #aaa;

  10. NLP --- 条件随机场CRF详解 重点 特征函数 转移矩阵

    上一节我们介绍了CRF的背景,本节开始进入CRF的正式的定义,简单来说条件随机场就是定义在隐马尔科夫过程的无向图模型,外加可观测符号X,这个X是整个可观测向量.而我们前面学习的HMM算法,默认可观测符 ...