这部分我要知道两点就是nacos如何去注册服务和发现服务的。

一 工程结构和版本依赖

首先要说一个我们的springcloud工程,基于半仙的springcloud工程,这个工程比较有意思,就是我很少看到pom文件一层套一层,相当于是三级pom maven文件。

第二个是这个工程架构,主要分4个大的module,每个moudule下面又会有两个三个子module,将服务划分到子module级别有的是提供基础bean,dao有的是直接提供向外应用的服务。

  • coupon-template-serv 优惠券模板服务
  • coupon-calculation-serv 优惠券计算服务
  • coupon-customer-serv 用户服务
  • middleware 提供中间件(微服务用到的)

第三个就是关于微服务的版本,实际上一说到版本就想起版本依赖这种问题,即使不考虑各个组件组件依赖支持版本神仙打架的问题。即使选一个版本来用,也会遇到用低了怕太low,用高了,怕不兼容。最好的方案就是等子弹飞一会,新版本出来不盲目追新,让他成熟一下,用次最新版本稳定性最好的也不是一个好办法。

这里是推荐,既然选择组件选择了springcloudAlibaba组件库,那就根据人家官网的毕业版本来搭配,springcloud,springboot,springcloudalibaba
在这里插入图片描述
springcloudalibaba 毕业版本

我选择的是 springcloud,springcloudalibaba springboot版本:

  • spring-cloud-dependencies 2020.0.1
  • spring-cloud-alibaba-dependencies 2021.1
  • spring-boot-starter-parent 2.4.2
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.2</version>
    </parent>

    <groupId>com.geekbang</groupId>
    <artifactId>geekbang-coupon</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>coupon-template-serv</module>
        <module>coupon-calculation-serv</module>
        <module>coupon-customer-serv</module>
        <module>middleware</module>
    </modules>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2020.0.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.0</version>
            </dependency>

            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-collections4</artifactId>
                <version>4.0</version>
            </dependency>

            <dependency>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
                <version>1.9</version>
            </dependency>

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.31</version>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.20</version>
            </dependency>

            <dependency>
                <groupId>jakarta.validation</groupId>
                <artifactId>jakarta.validation-api</artifactId>
                <version>2.0.2</version>
            </dependency>

            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>16.0</version>
            </dependency>
        </dependencies>
    </dependencyManagement>


</project>

二 整合nacos进去

我们划分module时,知道并不是所有的module都是服务生产者,服务消费者,所以我这里的nacos整合也是先拿coupon-template-serv 和 coupon-calculation-serv 子模块添加。


<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

在添加完依赖项之后,我们就可以通过配置项开启 Nacos 的服务治理功能了。Nacos 通过自动装配流程(auto configuration)加载配置项并开启服务注册。(关键词自动装配)

在 Spring Cloud 稍早一些的版本中,我们需要在启动类上添加 @EnableDiscoveryClient 注解开启服务治理功能,而在新版本的 Spring Cloud 中,这个注解不再是一个必须的步骤,我们只需要通过配置项就可以开启 Nacos 的功能。

nacos自动装配原理
早期版本启动类上添加 @EnableDiscoveryClient 注解开启服务治理功能

  • NacosDiscoveryAutoConfiguration:服务发现功能的自动装配器,它主要做两件事儿:加载 Nacos 配置项,声明
    NacosServiceDiscovery 类用作服务发现;
  • NacosServiceAutoConfiguration:声明核心服务治理类 NacosServiceManager,它可以通过
    service id、group 等一系列参数获取已注册的服务列表;
  • NacosServiceRegistryAutoConfiguration:Nacos 服务注册的自动装配器。

@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 可以用作环境隔离或者多租户隔离,其中:

  • 环境隔离:比如设置三个命名空间 production、pre-production 和
    dev,分别表示生产环境、预发环境和开发环境,如果一个微服务注册到了 dev
    环境,那么他无法调用其他环境的服务,因为服务发现机制只会获取到同样注册到 dev 环境的服务列表。如果未指定 namespace
    则服务会被注册到 public 这个默认 namespace 下。
  • 多租户隔离:即 multi-tenant 架构,通过为每一个用户提供独立的 namespace 以实现租户与租户之间的环境隔离。

Group 的使用场景非常灵活,
我来列举几个:

  • 环境隔离:在多租户架构之下,由于 namespace 已经被用于租户隔离,为了实现同一个租户下的环境隔离,你可以使用 group
    作为环境隔离变量。
  • 线上测试:对于涉及到上下游多服务联动的场景,我将线上已部署的待上下游测服务的 group
    设置为“group-A”,由于这是一个新的独立分组,所以线上的用户流量不会导向到这个
    group。这样一来,开发人员就可以在不影响线上业务的前提下,通过发送测试请求到“group-A”的机器完成线上测试。
  • 单元封闭:什么是单元封闭呢?为了保证业务的高可用性,通常我们会把同一个服务部署在不同的物理单元(比如张北机房、杭州机房、上海机房),当某个中心机房出现故障的时候,我们可以在很短的时间内把用户流量切入其他单元机房。由于同一个单元内的服务器资源通常部署在同一个物理机房,因此本单元内的服务调用速度最快,而跨单元的服务调用将要承担巨大的网络等待时间。这种情况下,我们可以为同一个单元的服务设置相同的
    group,使微服务调用封闭在当前单元内,提高业务响应速度。

反正就是namespace要比group维度高一个级别

验证 Nacos 服务注册功能

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐