这部分我要知道两点就是nacos如何去注册服务和发现服务的。
首先要说一个我们的springcloud工程,基于半仙的springcloud工程,这个工程比较有意思,就是我很少看到pom文件一层套一层,相当于是三级pom maven文件。
第二个是这个工程架构,主要分4个大的module,每个moudule下面又会有两个三个子module,将服务划分到子module级别有的是提供基础bean,dao有的是直接提供向外应用的服务。
第三个就是关于微服务的版本,实际上一说到版本就想起版本依赖这种问题,即使不考虑各个组件组件依赖支持版本神仙打架的问题。即使选一个版本来用,也会遇到用低了怕太low,用高了,怕不兼容。最好的方案就是等子弹飞一会,新版本出来不盲目追新,让他成熟一下,用次最新版本稳定性最好的也不是一个好办法。
这里是推荐,既然选择组件选择了springcloudAlibaba组件库,那就根据人家官网的毕业版本来搭配,springcloud,springboot,springcloudalibaba
springcloudalibaba 毕业版本
我选择的是 springcloud,springcloudalibaba springboot版本:
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.4.2
com.geekbang
geekbang-coupon
pom
1.0-SNAPSHOT
coupon-template-serv
coupon-calculation-serv
coupon-customer-serv
middleware
8
8
org.springframework.cloud
spring-cloud-dependencies
2020.0.1
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2021.1
pom
import
org.apache.commons
commons-lang3
3.0
org.apache.commons
commons-collections4
4.0
commons-codec
commons-codec
1.9
com.alibaba
fastjson
1.2.31
org.projectlombok
lombok
1.18.20
jakarta.validation
jakarta.validation-api
2.0.2
com.google.guava
guava
16.0
我们划分module时,知道并不是所有的module都是服务生产者,服务消费者,所以我这里的nacos整合也是先拿coupon-template-serv 和 coupon-calculation-serv 子模块添加。
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
在添加完依赖项之后,我们就可以通过配置项开启 Nacos 的服务治理功能了。Nacos 通过自动装配流程(auto configuration)加载配置项并开启服务注册。(关键词自动装配)
在 Spring Cloud 稍早一些的版本中,我们需要在启动类上添加 @EnableDiscoveryClient 注解开启服务治理功能,而在新版本的 Spring Cloud 中,这个注解不再是一个必须的步骤,我们只需要通过配置项就可以开启 Nacos 的功能。
nacos自动装配原理
早期版本启动类上添加 @EnableDiscoveryClient 注解开启服务治理功能
@Configuration(proxyBeanMethods = false)
// 当spring.cloud.discovery.enabled=true时才生效
@ConditionalOnDiscoveryEnabled
// 当spring.cloud.nacos.discovery.enabled=true时生效
@ConditionalOnNacosDiscoveryEnabled
public class NacosDiscoveryAutoConfiguration {
// 读取Nacos所有配置项并封装到NacosDiscoveryProperties中
@Bean
//这个ConditionalOnMissingBean可以看做是我们的懒汉模式,没有我就创建实例化这个bean
@ConditionalOnMissingBean
public NacosDiscoveryProperties nacosProperties() {
return new NacosDiscoveryProperties();
}
// 声明服务发现的功能类NacosServiceDiscovery
@Bean
@ConditionalOnMissingBean
public NacosServiceDiscovery nacosServiceDiscovery(
NacosDiscoveryProperties discoveryProperties,
NacosServiceManager nacosServiceManager) {
return new NacosServiceDiscovery(discoveryProperties, nacosServiceManager);
}
}
nacos配置项(这里都是项目涉及到nacos可能要涉及到设置的)
spring:
cloud:
nacos:
discovery:
# Nacos的服务注册地址,可以配置多个,逗号分隔
server-addr: localhost:8848
# 服务注册到Nacos上的名称,一般不用配置
service: coupon-customer-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
常用的配置项
Namespace 可以用作环境隔离或者多租户隔离,其中:
Group 的使用场景非常灵活,
我来列举几个:
反正就是namespace要比group维度高一个级别
naocs设置好namespace如下,红框中的id要作为nacoa配置设置进去,要不然你还不如不设置,都在public里面,namespace和group的好处当然你也体验不到。
这里要设置好上边的配置,在设置namespece的时候一定要把id设置进去而不是这是的名字
cloud:
nacos:
discovery:
# 可以配置多个,逗号分隔
server-addr: localhost:8848
# 默认就是application name,一般不用配置
service: coupon-template-serv
# nacos客户端向服务端发送心跳的时间间隔,时间单位其实是ms
heart-beat-interval: 5000
# 服务端没有接受到客户端心跳请求就将其设为不健康的时间间隔,默认为15s
# 注:推荐值该值为15s即可,如果有的业务线希望服务下线或者出故障时希望尽快被发现,可以适当减少该值
heart-beat-timeout: 15000
# [注意] 这个IP地址如果更换网络后变化,会导致服务调用失败,建议先不要设置
# ip: 172.20.7.228
# 元数据部分 - 可以自己随便定制
metadata:
mydata: abc
# 客户端在启动时是否读取本地配置项(一个文件)来获取服务列表
# 注:推荐该值为false,若改成true。则客户端会在本地的一个文件中保存服务信息,当下次宕机启动时,会优先读取本地的配置对外提供服务。
naming-load-cache-at-start: false
# 创建不同的集群
cluster-name: Cluster-A
# 命名空间ID,Nacos通过不同的命名空间来区分不同的环境,进行数据隔离,
# 服务消费时只能消费到对应命名空间下的服务。
# [注意]需要在nacos-server中创建好namespace,然后把id copy进来
namespace: 5e859753-70c7-47a5-a4fc-ef6aa63a34e0
# [注意]两个服务如果存在上下游调用关系,必须配置相同的group才能发起访问
group: myGroup
# 向注册中心注册服务,默认为true
# 如果只消费服务,不作为服务提供方,倒是可以设置成false,减少开销
register-enabled: true
# 类似长连接监听服务端信息变化的功能
watch:
enabled: true
watch-delay: 30000