本文讲解项目中集成nacos,并将nacos作为注册中心使用的过程。本文不涉及nacos的原理。
1、项目简介
以一个演示项目为例,项目包含三个服务,调用及依赖如下图:
由图中可以看出,coupon-customer-serv为服务的消费者,coupon-calculation-serv和coupon-template-serv为服务的提供者。业务简述如下表:
序号 | 服务名称 | 服务描述 |
---|---|---|
1 | coupon-template-serv | 优惠卷模板服务,提供模板的创建功能。比如打折优惠券,当用户领取优惠卷时,优惠卷由模板生成,而具体打折多少,由商家指定。 |
2 | coupon-calculation-serv | 优惠卷计算服务。当用户支付订单时,根据用户购买的商品和已有的优惠券,计算实际支付的货款。 |
3 | coupon-customer-serv | 用户服务。包含用户领取优惠券、支付等功能。 |
2、主要依赖的版本
- springboot:2.4.2
- spring cloud:2020.0.1
- spring cloud alibaba:2021.1
3、开工
关于springboot项目的搭建,此处略过。此处只讨论spring cloud相关的内容。先集成服务提供者(coupon-template-serv、coupon-calculation-serv),再集成服务消费者。
3.1、模块内部结构介绍
下面从coupon-template-serv服务开始,集成nacos。该服务的目录结构如下:
内部各模块介绍:
- coupon-template-api:存放该项目用到dto类
- coupon-template-dao: 数据库操作模块
- coupon-template-impl: 服务层和controller保存的地方,也是springboot的入口。
3.2、引入依赖
打开coupon-template-serv模块下的pom.xml文件(也就是模块的根pom.xml),添加如下依赖:
<!--spring cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
打开coupon-template-impl模块下的pom.xml文件,添加nacos依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
3.3、配置nacos服务发现
打开coupon-template-impl下的application.yml文件,添加如下配置:
spring:
cloud:
nacos:
discovery:
# Nacos的服务注册地址,可以配置多个,逗号分隔
server-addr: 192.168.110.165:8848,192.168.110.165:8948
# 服务注册到Nacos上的名称,一般不用配置
service: coupon-template-serv
# nacos客户端向服务端发送心跳的时间间隔,时间单位其实是ms
heart-beat-interval: 5000
# 服务端没有接受到客户端心跳请求就将其设为不健康的时间间隔,默认为15s
# 注:推荐值该值为15s即可,如果有的业务线希望服务下线或者出故障时希望尽快被发现,可以适当减少该值
heart-beat-timeout: 20000
# 元数据部分 - 可以自己随便定制
metadata:
mydata: abc
# 客户端在启动时是否读取本地配置项(一个文件)来获取服务列表
# 注:推荐该值为false,若改成true。则客户端会在本地的一个
# 文件中保存服务信息,当下次宕机启动时,会优先读取本地的配置对外提供服务。
naming-load-cache-at-start: false
# 命名空间ID,Nacos通过不同的命名空间来区分不同的环境,进行数据隔离,
namespace: dev
# 创建不同的集群
cluster-name: Cluster-A
# [注意]两个服务如果存在上下游调用关系,必须配置相同的group才能发起访问
group: myGroup
# 向注册中心注册服务,默认为true
# 如果只消费服务,不作为服务提供方,倒是可以设置成false,减少开销
register-enabled: true
配置的注释比较详细,可以对照着看。注意nacos的ip地址和端口改成你自己的。
3.4、验证集成成功
启动nacos,再启动coupon-template-impl,仔细观察打印的日志,如图:
再打开nacos管理端,看服务的注册情况,因为我们的服务注册在namespace dev下,所以看dev:
至此,服务提供者集成完毕,并验证成功。
coupon-calculation-serv服务也是服务提供者,集成过程类似,此处不再赘述。
3.5、服务消费者coupon-customer-serv集成
项目结构如图:
3.5.1、添加依赖
根pom.xml与上面一致,但是作为服务的消费者,需要配置负载均衡等依赖。所以,打开
coupon-custom-impl模块的pom.xml文件,添加以下依赖:
<!--服务发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!--webflux调用-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
再配置application.yml文件,它与上面两个服务配置一样,保证服务名称不一致就行了。再次查看nacos管理端,现在有三个服务在注册中心。
4、发起远程调用
这里用webflux发起调用,有兴趣的同学去网上查一下资料,这里仅展示一下调用的代码:
...
CouponTemplateInfo templateInfo = webClientBuilder.build()
.get()
.uri("http://coupon-template-serv/template/getTemplate?id=" + request.getCouponTemplateId())
.retrieve()
.bodyToMono(CouponTemplateInfo.class)
.block();
注意:uri中用的是服务名而不是ip地址+端口,这样调用时,nacos会把具体的地址给调用方,另一个,还有负载均衡的意思。因为实际中用webflux调用的比较少,话不多说。
注入webClientBuilder对象:
@Autowired
private WebClient.Builder webClientBuilder;
webClientBuilder对象的配置:
@org.springframework.context.annotation.Configuration
public class Configuration {
@Bean
@LoadBalanced
public WebClient.Builder register() {
return WebClient.builder();
}
}
5、三个服务git
coupon-template-serv
coupon-calculation-serv
coupon-custom-serv
Ok, Have a nice day!