• Nacos学习服务发现(二)之服务注册


    创建父工程

    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    为了规范依赖的版本,这里创建父工程,指定依赖的版本。
    父工程pom.xml如下:

    1. <project xmlns="http://maven.apache.org/POM/4.0.0"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>com.demo.nacosgroupId>
    6. <artifactId>nacos-discoveryartifactId>
    7. <version>1.0-SNAPSHOTversion>
    8. <packaging>pompackaging>
    9. <properties>
    10. <project.build.sourceEncoding>UTF‐8project.build.sourceEncoding>
    11. <project.reporting.outputEncoding>UTF‐8project.reporting.outputEncoding>
    12. <java.version>1.8java.version>
    13. properties>
    14. <dependencyManagement>
    15. <dependencies>
    16. <dependency>
    17. <groupId>com.alibaba.cloudgroupId>
    18. <artifactId>spring-cloud-alibaba-dependenciesartifactId>
    19. <version>2.1.0.RELEASEversion>
    20. <type>pomtype>
    21. <scope>importscope>
    22. dependency>
    23. <dependency>
    24. <groupId>org.springframework.cloudgroupId>
    25. <artifactId>spring-cloud-dependenciesartifactId>
    26. <version>Greenwich.RELEASEversion>
    27. <type>pomtype>
    28. <scope>importscope>
    29. dependency>
    30. <dependency>
    31. <groupId>org.springframework.bootgroupId>
    32. <artifactId>spring-boot-dependenciesartifactId>
    33. <version>2.1.3.RELEASEversion>
    34. <type>pomtype>
    35. <scope>importscope>
    36. dependency>
    37. dependencies>
    38. dependencyManagement>
    39. <build>
    40. <plugins>
    41. <plugin>
    42. <groupId>org.springframework.bootgroupId>
    43. <artifactId>spring-boot-maven-pluginartifactId>
    44. plugin>
    45. plugins>
    46. build>
    47. project>

    服务生产者

    在这里插入图片描述
    创建生产者模块

     在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

     在这里插入图片描述

     以下步骤演示了如何将一个服务生产者注册到 Nacos。

    1、pom.xml的配置。
    包括Spring Cloud Feign组件、Spring Cloud Alibaba Nacos Discovery组件以及Spring boot web相关组件依赖。

    1. <project xmlns="http://maven.apache.org/POM/4.0.0"
    2.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4.     <parent>
    5.         <artifactId>nacos-discoveryartifactId>
    6.         <groupId>com.demo.nacosgroupId>
    7.         <version>1.0-SNAPSHOTversion>
    8.     parent>
    9.     <modelVersion>4.0.0modelVersion>
    10.     <artifactId>quickstart-providerartifactId>
    11.     <dependencies>
    12.         <dependency>
    13.             <groupId>com.alibaba.cloudgroupId>
    14.             <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    15.         dependency>
    16.         <dependency>
    17.             <groupId>org.springframework.bootgroupId>
    18.             <artifactId>spring-boot-starter-webartifactId>
    19.         dependency>
    20.         <dependency>
    21.             <groupId>org.springframework.cloudgroupId>
    22.             <artifactId>spring-cloud-starter-openfeignartifactId>
    23.         dependency>
    24.     dependencies>
    25. project>

    2、application.yml配置。一些关于 Nacos 基本的配置也必须在application.yml(也可以是application.properties)
    配置,如下所示: application.yml

    1. server:
    2. port: 56010 # 启动端口
    3. spring:
    4. application:
    5. name: quickstart-provider
    6. cloud:
    7. nacos:
    8. discovery:
    9. server-addr: 127.0.0.1:8848
    10. logging:
    11. level:
    12. root: info
    13. org.springframework: info

    Note: spring.cloud.nacos.discovery.server-addr 指定了Nacos Server的网络地址和端口号。

    • 3、启动Provider(生产者)
    1. package com.demo.nacos;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    5. import org.springframework.cloud.openfeign.EnableFeignClients;
    6. /**
    7. * Description:
    8. * DATE: 2022/1/26 17:14
    9. */
    10. @SpringBootApplication
    11. @EnableDiscoveryClient
    12. @EnableFeignClients
    13. public class NacosProviderApp {
    14. public static void main(String[] args) {
    15. SpringApplication.run(NacosProviderApp.class,args);
    16. }
    17. }
    • 4、Provider(生产者)服务实现
    1. package com.demo.nacos.controller;
    2. import org.slf4j.LoggerFactory;
    3. import org.springframework.web.bind.annotation.GetMapping;
    4. import org.springframework.web.bind.annotation.RestController;
    5. import java.util.logging.Logger;
    6. /**
    7. * Description:
    8. * DATE: 2022/1/26 17:15
    9. */
    10. @RestController
    11. public class ProviderController {
    12. private static final Logger LOG = (Logger) LoggerFactory.getLogger(ProviderController.class);
    13. @GetMapping("/service")
    14. public String service(){
    15. LOG.info("provider invoke");
    16. return "provider invoke";
    17. }
    18. }

    服务消费者

    1、pom.xml的配置。

    1. <project xmlns="http://maven.apache.org/POM/4.0.0"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <parent>
    5. <artifactId>nacos-discoveryartifactId>
    6. <groupId>com.demo.nacosgroupId>
    7. <version>1.0-SNAPSHOTversion>
    8. parent>
    9. <modelVersion>4.0.0modelVersion>
    10. <artifactId>quickstart-consumerartifactId>
    11. <dependencies>
    12. <dependency>
    13. <groupId>com.alibaba.cloudgroupId>
    14. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    15. dependency>
    16. <dependency>
    17. <groupId>org.springframework.bootgroupId>
    18. <artifactId>spring-boot-starter-webartifactId>
    19. dependency>
    20. <dependency>
    21. <groupId>org.springframework.cloudgroupId>
    22. <artifactId>spring-cloud-starter-openfeignartifactId>
    23. dependency>
    24. dependencies>
    25. project>

    2、application.yml配置

    1. server:
    2. port: 56020 # 启动端口
    3. spring:
    4. application:
    5. name: quickstart-consumer
    6. cloud:
    7. nacos:
    8. discovery:
    9. server-addr: 127.0.0.1:8848
    10. logging:
    11. level:
    12. root: info
    13. org.springframework: info

    3、Consumer(消费者)启动类

    1. package com.demo.nacos;
    2. import org.springframework.boot.SpringApplication;
    3. import org.springframework.boot.autoconfigure.SpringBootApplication;
    4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    5. import org.springframework.cloud.openfeign.EnableFeignClients;
    6. /**
    7. * Description:
    8. * DATE: 2022/1/26 17:42
    9. */
    10. @SpringBootApplication
    11. @EnableDiscoveryClient
    12. @EnableFeignClients
    13. public class NacosConsumerApp {
    14. public static void main(String[] args) {
    15. SpringApplication.run(NacosConsumerApp.class, args);
    16. }
    17. }

    4、Provider(生产者)远程代理定义

    1. package com.demo.nacos.client;
    2. import org.springframework.cloud.openfeign.FeignClient;
    3. import org.springframework.web.bind.annotation.GetMapping;
    4. /**
    5. * Description:
    6. * DATE: 2022/1/26 17:36
    7. */
    8. @FeignClient(value = "quickstart-provider")
    9. public interface ProviderClient {
    10. @GetMapping("service")
    11. String service();
    12. }

    5、Consumer(消费者)服务实现

    1. package com.demo.nacos.controller;
    2. import com.demo.nacos.client.ProviderClient;
    3. import org.slf4j.Logger;
    4. import org.slf4j.LoggerFactory;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.web.bind.annotation.GetMapping;
    7. import org.springframework.web.bind.annotation.RestController;
    8. /**
    9. * Description:
    10. * DATE: 2022/1/26 17:39
    11. */
    12. @RestController
    13. public class ConsumerController {
    14. private static final Logger log = LoggerFactory.getLogger(ConsumerController.class);
    15. @Autowired
    16. ProviderClient providerClient;
    17. @GetMapping("/service")
    18. public String service(){
    19. log.info("consumer invoke");
    20. //远程调用
    21. String providerResult = providerClient.service();
    22. return "consumer invoke"+"|"+providerResult;
    23. }
    24. }

    浏览器访问 http://127.0.0.1:8848/nacos ,打开nacos控制台,并点击菜单服务管理->服务列表,可展示出刚刚注
    册的两个服务:

     访问地址:http://127.0.0.1:56020/service

    在这里插入图片描述
    测试多实例负载均衡

    修改quickstart-provider工程的application.yaml,实现port动态传入:

    在这里插入图片描述
    设置启动参数:
    NacosProviderApp 

    在这里插入图片描述
    NacosProviderApp

    在这里插入图片描述

     启动quickstart-provider两个实例。

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    请求http://127.0.0.1:56020/service测试负载均衡。
    跟踪quickstart-provider两个实例的控制台的日志输出,默认负载均衡策略是轮询。

    在这里插入图片描述

    Nacos服务发现基础应用

    服务发现数据模型


    n
    nacos在经过阿里内部多年生产经验后提炼出的数据模型,则是一种服务-集群-实例的三层模型,这样基本可以满足服务在所有场景下的数据存储和管理。

    image-20220720092820227

    命名空间

    用于进行租户粒度的配置隔离,命名空间不仅适用于nacos的配置管理,同样适用于服务发下。Namespace的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置,服务)隔离等。

    服务

    提供给客户端的软件功能,通过预定义接口网络访问。

    实例

    提供一个或多个服务的具有可访问网络地址的进程,启动一个服务,就产生一个服务实例。

    元信息

    nacos数据描述信息,如服务版本,权重,容灾策略,负载均衡策略,鉴权配置,各种自定义标签,从作用范围来看,分为服务级别的元信息,集群的元信息以及实例的元信息。

    在这里插入图片描述

    集群

    服务实例的集合,服务实例组成一个默认集群,集群可以被进一步按需求划分,划分的单位可以是虚拟集群,相同集群下的实例才能相互感知。

    应用通过Namespace,Service ,Cluster(DEFAULT)的配置,描述了该服务向哪个环境的哪个集群注册实例。

    1. spring:
    2. application:
    3. name: provider
    4. cloud:
    5. nacos:
    6. discovery:
    7. server-addr: 127.0.0.1:8848
    8. namespace: 869a0c6d-267e-4aa1-96cb-552cb1632c72 #开发环境
    9. cluster-name: DEFAULT #集群的名称(默认为DEFAULT)

    TIPS: 集群作为实例的隔离,同一个集群的实例才能互相感知。
    TIPS: namepsace,cluster-name 如果不填写将会采用默认值,namespace的默认命名空间public,cluster-name的默认值是DEFAULT集群

    将实例注册到自定义的命名空间和集群

    在配置里指定命名空间和集群后,重启实例。
    在这里插入图片描述

    此时可以看到dev下面注册了provider服务,并且该服务下包含一个TEST集群
    在这里插入图片描述

     服务管理

            开发者或者运维人员往往需要在服务注册后,通过友好的界面来查看服务的注册情况,包括当前系统注册的所有服务和每个服务的详情。并在有权限控制的情况下,进行服务的一些配置的编辑操作。Nacos在目前最新版本开放的控制台的服务发现部分,主要就是提供用户一个基本的运维页面,能够查看、编辑当前注册的服务,这些功能集中在Nacos控制台的服务管理一级菜单内。

    服务列表管理

            服务列表帮助用户以统一的视图管理其所有的微服务以及服务健康状态。整体界面布局是左上角有服务的搜索框和搜索按钮,页面中央是服务列表的展示。服务列表主要展示服务名、集群数目、实例数目、健康实例数目和详情按钮五个栏目。

    在这里插入图片描述

    在服务列表页面点击详情,可以看到服务的详情。可以查看服务、集群和实例的基本信息。 

    服务流量权重支持及流量保护

    Nacos 为用户提供了流量权重控制的能力,同时开放了服务流量的阈值保护,以帮助用户更好的保护服务服务提供者集群不被意外打垮。如下图所以,可以点击实例的编辑按钮,修改实例的权重。如果想增加实例的流量,可以将权重调大,如果不想实例接收流量,则可以将权重设为0。
    在这里插入图片描述

     服务元数据管理

            Nacos提供多个维度的服务元数据的暴露,帮助用户存储自定义的信息。这些信息都是以K-V的数据结构存储,在控制台上,会以k1=v1,k2=v2这样的格式展示。类似的,编辑元数据可以通过相同的格式进行。例如服务的元数据编辑,首先点击服务详情页右上角的“编辑服务”按钮,然后在元数据输入框输入:version=1.0
    在这里插入图片描述

     点击确认,就可以在服务详情页面,看到服务的元数据已经更新了。

    在这里插入图片描述

    服务优雅上下线

            Nacos还提供服务实例的上下线操作,在服务详情页面,可以点击实例的“上线”或者“下线”按钮,被下线的实例,将不会包含在健康的实例列表里。

    在这里插入图片描述

    上下线测试:

    (1)分别启动快速上手中的quickstart-consumer与quickstart-provider工程,更改quickstart-provide中的启动端口,再次启动quickstart-provider,让quickstart-provider服务拥有两个实例。

    在这里插入图片描述

    (2)多次访问http://127.0.0.1:56020/service ,让consumer调用provider时触发负载均衡。

    (3)观察provider的2个实例控制台,可发现实例调用被均匀负载。

    (4)在provider的服务详情页面,让某实例下线。

    在这里插入图片描述

    (5)多次访问http://127.0.0.1:56020/service ,观察控制台,发现下线的实例已不再接收流量。

    (6)在provider的服务详情页面,让该实例恢复上线状态。

    (7)多次访问http://127.0.0.1:56020/service ,观察控制台,发现恢复上线的实例已恢复流量访问。

    多实例负载

    启动quickstart-provider两个实例。

    在这里插入图片描述

    在这里插入图片描述

    请求http://127.0.0.1:56020/service测试负载均衡。

    跟踪quickstart-provider两个实例的控制台的日志输出,默认负载均衡策略是轮询。

    初始化代码

    pom依赖

    1. <dependencyManagement>
    2.     <dependencies>
    3.         <dependency>
    4.             <groupId>com.alibaba.cloudgroupId>
    5.             <artifactId>spring-cloud-alibaba-dependenciesartifactId>
    6.             <version>2021.0.1.0version>
    7.             <type>pomtype>
    8.             <scope>importscope>
    9.         dependency>
    10.         <dependency>
    11.             <groupId>org.springframework.cloudgroupId>
    12.             <artifactId>spring-cloud-dependenciesartifactId>
    13.             <version>2021.0.1version>
    14.             <type>pomtype>
    15.             <scope>importscope>
    16.         dependency>
    17.         <dependency>
    18.             <groupId>org.springframework.bootgroupId>
    19.             <artifactId>spring-boot-dependenciesartifactId>
    20.             <version>2.6.3version>
    21.             <type>pomtype>
    22.             <scope>importscope>
    23.         dependency>
    24.     dependencies>
    25. dependencyManagement>
    26. <dependencies>
    27.     <dependency>
    28.         <groupId>org.springframework.bootgroupId>
    29.         <artifactId>spring-boot-starter-webartifactId>
    30.     dependency>
    31.     <dependency>
    32.         <groupId>org.springframework.bootgroupId>
    33.         <artifactId>spring-boot-starter-testartifactId>
    34.         <scope>testscope>
    35.     dependency>
    36.     <dependency>
    37.         <groupId>com.alibaba.cloudgroupId>
    38.         <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    39.     dependency>
    40.     <dependency>
    41.         <groupId>org.springframework.cloudgroupId>
    42.         <artifactId>spring-cloud-starter-openfeignartifactId>
    43.     dependency>
    44. dependencies>

     启动配置

    1. import org.springframework.boot.SpringApplication;
    2. import org.springframework.boot.autoconfigure.SpringBootApplication;
    3. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    4. import org.springframework.cloud.openfeign.EnableFeignClients;
    5. @SpringBootApplication
    6. @EnableDiscoveryClient
    7. @EnableFeignClients
    8. public class StartUp {
    9.     public static void main(String[] args) {
    10.         SpringApplication.run(StartUp.class, args);
    11.     }
    12. }

    配置文件

    1. server.port=8090
    2. spring.application.name=test-naocs
    3. spring.cloud.nacos.discovery.server-addr=8.131.239.157:8848
    4. spring.cloud.nacos.discovery.namespace=053a04db-74b3-46da-9a4e-09a4f0a5f88a
    5. spring.cloud.nacos.discovery.group=test

     项目代码

    1. import org.springframework.web.bind.annotation.GetMapping;
    2. import org.springframework.web.bind.annotation.RequestMapping;
    3. import org.springframework.web.bind.annotation.RestController;
    4. @RequestMapping("/health")
    5. @RestController
    6. public class HealthController {
    7.     @GetMapping("/check")
    8.     public String check() {
    9.         return "success";
    10.     }
    11. }

    消费接口

    1. @FeignClient(name = "test-naocs") 
    2. public interface ProviderClient {
    3.   @GetMapping("/health/check")
    4.   String service(); 
    5. }

    附:Spring Cloud Nacos discovery Starter配置项信息说明

    配置项Key默认值说明
    地址spring.cloud.nacos.discovery.server-addrNacosServer 启动监听的ip地址和端口
    服务名spring.cloud.nacos.discovery.service${spring.application.name}给当前的服务命名
    服务分组spring.cloud.nacos.discovery.groupDEFAULT_GROUP设置服务所处的分组
    权重spring.cloud.nacos.discovery.weight1取值范围 1 到 100,数值越大,权重越大
    网卡名spring.cloud.nacos.discovery.network-interface当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址
    注册的IP地址spring.cloud.nacos.discovery.ip优先级最高
    注册的端口spring.cloud.nacos.discovery.port-1默认情况下不用配置,会自动探测
    命名空间spring.cloud.nacos.discovery.namespace常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生 产环境的资源(如配置、服务)隔离等。
    AccessKeyspring.cloud.nacos.discovery.access-key当要上阿里云时,阿里云上面的一个云账号名
    SecretKeyspring.cloud.nacos.discovery.secret-key当要上阿里云时,阿里云上面的一个云账号密码
    Metadataspring.cloud.nacos.discovery.metadata使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关 的元数据信息
    日志文件名spring.cloud.nacos.discovery.log-name
    集群spring.cloud.nacos.discovery.cluster-nameDEFAULT配置成Nacos集群名称
    接入点spring.cloud.nacos.discovery.enpointUTF-8地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
    是否集成Ribbonribbon.nacos.enabledtrue一般都设置成true即可
    是否开启NacosWatchspring.cloud.nacos.discovery.watch.enabledtrue可以设置成false来关闭 watch

  • 相关阅读:
    流程管理与商务智能解决方案(62页PPT)
    玩转TypeScript之你真的了解this所指对象吗
    【JVM技术专题】针对于Class字节码的文件分析和研究指南 「 进阶篇」
    计算机网络——分组延时、丢失和吞吐量
    项目实战——实现注册和登录模块
    xxl-job集成钉钉群告警
    一个全局最优化的方法:随机游走算法-Random-Walk
    Vue消息订阅与发布
    群晖NAS:通过Docker 部署宝塔面板【注册表:cyberbolt/baota】
    WordPress建站入门教程:小皮面板phpstudy如何安装PHP和切换php版本?
  • 原文地址:https://blog.csdn.net/weixin_53998054/article/details/126077436