程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-05(1)

SpringCloud-08-Alibaba Nacos服务注册与发现

发布于2021-06-12 13:03     阅读(111)     评论(0)     点赞(15)     收藏(2)


1. Spring Cloud Alibaba 介绍

下图是 Spring Cloud 官网给出的架构图,可以看到这个图中间就是各个微服务的实现,周边是去围绕这些微服务进行治理的支持性功能,例如分布式追踪、服务注册、配置服务等。

Spring Cloud 是以微服务为核心的分布式系统的一个构建标准,而Spring Cloud Alibaba是 Spring Cloud 标准的实现,目前 Spring Cloud Alibaba 成为了 Spring Cloud 家族中最受关注的框架。

上图中深色的部分,其实它就是 Spring Cloud 标准,一共有 3 层。

  • 中间颜色最深的部分就是及整个微服务最核心的内容,包括了“ RPC 调用”以及“服务注册与发现”。
  • 第二层,也就是围绕着核心的这一圈,是一些辅助微服务更好的工作功能,包括了负载均衡、路由、网关、断路器,还有分布式追踪等等这些内容。
  • 再外层的话,主要是些分布式云环境里通用能力。

最外面这一圈,是 Spring Cloud Alibaba 对 Spring Cloud 的实现。

  • 右上部分是对于 Spring Cloud 标准的实现。例如,我们通过 Dubbo 实现了 RPC 调用功能,通过 Nacos 实现了“服务注册与发现”、“分布式配置”,通过 Sentinel 实现了断路器等等,这里就不一一列举了。
  • 左下部分是我们 Spring Cloud Alibaba 对阿里云各种服务的集成。

Spring Cloud Alibaba 组件

  • Sentinel
    阿里巴巴开源产品,把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

  • Nacos
    阿里巴巴开源产品,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

  • RocketMQ
    Apache RocketMQ™ 基于 Java 的高性能、高吞吐量的分布式消息和流计算平台。

  • Dubbo
    Apache Dubbo™ 是一款高性能 Java RPC 框架。

  • Seata
    阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

  • Alibaba Cloud OSS
    阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

  • Alibaba Cloud SchedulerX
    阿里中间件团队开发的一款分布式任务调度产品,支持周期性的任务与固定时间点触发任务。

  • Alibaba Cloud SMS
    覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

2. Nacos Server 准备

参考 Nacos 官网:https://nacos.io/zh-cn/docs/quick-start.html

  • 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。
  • 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。

2.1 预备环境准备

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

  • 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  • 64 bit JDK 1.8+。
  • Maven 3.2.x+。

2.2 下载源码或者安装包

你可以通过源码和发行包两种方式来获取 Nacos。

2.2.1 从 Github 上下载源码方式

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
ls -al distribution/target/

// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin

2.2.2 下载编译后压缩包方式

您可以从 最新稳定版本 下载 nacos-server-$version.zip 包。

  unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
  cd nacos/bin

2.3 启动服务器

Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式),参数 -m 指定启动模式:

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示"符号找不到",可尝试如下运行:

bash startup.sh -m standalone

Windows
启动命令(standalone代表着单机模式运行,非集群模式):

startup.cmd -m standalone

2.4 关闭服务器

Linux/Unix/Mac

sh shutdown.sh

Windows

shutdown.cmd

或者双击shutdown.cmd运行文件。

2.5 演示启动nacos-server

准备

  • nacos-server-1.4.2.tar.gz
  • Linux Centos7,ip: 192.168.42.51

解压并启动nacos-server

[root@localhost ~]# ll  nacos-server-1.4.2.tar.gz 
-rw-r--r--. 1 root root 77982774 6月   8 2021 nacos-server-1.4.2.tar.gz
[root@localhost ~]# tar -zxvf nacos-server-1.4.2.tar.gz 
[root@localhost ~]# cd nacos
[root@localhost nacos]# bin/startup.sh -m standalone
......
nacos is starting with standalone
nacos is starting,you can check the /root/nacos/logs/start.out
[root@localhost nacos]# tail -f -n 100 /root/nacos/logs/start.out
/home/tag/jdk1.8.0_231//bin/java  -Xms512m -Xmx512m -Xmn256m -Dnacos.standalone=true -Dnacos.member.list= -Djava.ext.dirs=/home/tag/jdk1.8.0_231//jre/lib/ext:/home/tag/jdk1.8.0_231//lib/ext -Xloggc:/root/nacos/logs/nacos_gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Dloader.path=/root/nacos/plugins/health,/root/nacos/plugins/cmdb -Dnacos.home=/root/nacos -jar /root/nacos/target/nacos-server.jar  --spring.config.additional-location=file:/root/nacos/conf/ --logging.config=/root/nacos/conf/nacos-logback.xml --server.max-http-header-size=524288

         ,--.
       ,--.'|
   ,--,:  : |                                           Nacos 1.4.2
,`--.'`|  ' :                       ,---.               Running in stand alone mode, All function modules
|   :  :  | |                      '   ,'\   .--.--.    Port: 8848
:   |   \ | :  ,--.--.     ,---.  /   /   | /  /    '   Pid: 10428
|   : '  '; | /       \   /     \.   ; ,. :|  :  /`./   Console: http://192.168.42.51:8848/nacos/index.html
'   ' ;.    ;.--.  .-. | /    / ''   | |: :|  :  ;_
|   | | \   | \__\/: . ..    ' / '   | .; : \  \    `.      https://nacos.io
'   : |  ; .' ," .--.; |'   ; :__|   :    |  `----.   \
|   | '`--'  /  /  ,.  |'   | '.'|\   \  /  /  /`--'  /
'   : |     ;  :   .'   \   :    : `----'  '--'.     /
;   |.'     |  ,     .-./\   \  /            `--'---'
'---'        `--`---'     `----'

2021-06-08 16:17:03,014 INFO Bean 'org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler@7af41b' of type [org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

2021-06-08 16:17:03,023 INFO Bean 'methodSecurityMetadataSource' of type [org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

2021-06-08 16:17:03,609 INFO Tomcat initialized with port(s): 8848 (http)

2021-06-08 16:17:04,184 INFO Root WebApplicationContext: initialization completed in 5552 ms
.......

浏览器上访问 http://192.168.42.51:8848/nacos/index.html ,输入默认的用户名密码 nacos/nacos,成功访问Naocs控制台,到此,我们的 nacos-server 搭建成功。


3. Nacos Naming Service 服务注册与发现 快速上手

Nacos Discovery用于服务注册与发现,功能类似于在前面的文章中我们介绍的Spring Cloud Eureka 和 Spring Cloud Zookeeper。

服务注册与发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于服务的动态扩缩容。
Nacos Discovery 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery 也将服务实例自身的一些元数据信息-例如 host,port, 健康检查 URL,主页等内容注册到 Nacos。

角色服务名称ip:port描述
Nacos Server192.168.42.51:8848Nacos服务端,注册中心
Nacos Clientservice-provider192.168.42.109:8070
192.168.42.109:8071
Nacos客户端,服务提供者
Nacos Clientservice-consumer192.168.42.109:8080Nacos客户端,服务消费者

3.1 父工程添加Spring Cloud Alibaba的依赖管理


    <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.3.3-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.3.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba 2.2.1.RELEASE-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

3.2 service-provider

新建服务提供者模块 provider-naocs-8070 ,添加 nacos-discovery 和 Actuator 依赖
provider-naocs-8070 pom.xml

<?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">
    <parent>
        <artifactId>006SpringCloud</artifactId>
        <groupId>com.xander</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>provider-naocs-8070</artifactId>

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

        <!-- Web Starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Boot Actuator Starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

</project>

provider-naocs-8070 添加配置。
application.yml

spring:
  application:
    # 服务名称
    name: service-provider
  cloud:
    nacos:
      discovery:
        # Nacos 注册中心配置地址
        server-addr: 192.168.42.51:8848
        # Nacos 客户端认证信息(默认用户名和密码均为 nacos)
        username: nacos
        password: nacos

management:
  endpoints:
    web:
      exposure:
        # 激活 Spring Boot Actuator Endpoints
        include=*:

server:
  # 应用服务端口
  port: 8070

在启动类上添加 @EnableDiscoveryClient 注解。
启动类 ProviderNacos8070.java

@SpringBootApplication
@EnableDiscoveryClient
public class ProviderNacos8070 {

    public static void main(String[] args) {
        SpringApplication.run(ProviderNacos8070.class, args);
    }
}

EchoController提供一个业务接口 “/echo/{msg}” ,响应String类型 "Hello Nacos Discovery, " + msg。
EchoController.java

@RestController
public class EchoController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/echo/{msg}")
    public String echo(@PathVariable String msg) {
        return "Hello Nacos Discovery " + serverPort + ", " + msg;
    }
}

根据 provider-naocs-8070 新建另一个服务提供者模块 provider-naocs-8071,依赖、配置、还有业务接口都一样,唯一不同的是服务端口为 8071。

3.3 service-consumer

在搭建 service-consumer 之前,跟大家说明下 nacos-discovery 组件,默认已经集成了 Netflix-Ribbon 的依赖,也就是说,我们可以通过在 RestTemplate 实例上添加 @LoadBalanced 注解来开启Ribbon客户端负载均衡。如果不清楚 Ribbon 的使用,可以看下我前面的文章《SpringCloud-02-Ribbon》。

新建服务提供者模块 consumer-nacos-8080 ,添加 nacos-discovery 和 Actuator 依赖
consumer-nacos-8080 pom.xml

<?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">
    <parent>
        <artifactId>006SpringCloud</artifactId>
        <groupId>com.xander</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>consumer-nacos-8080</artifactId>


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

        <!-- Spring WebMVC Starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Boot Actuator Starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

</project>

consumer-nacos-8080 添加配置。
application.yml

spring:
  application:
    # 服务名称
    name: service-consumer
  cloud:
    nacos:
      discovery:
        # Nacos 注册中心配置地址
        server-addr: 192.168.42.51:8848
        # Nacos 客户端认证信息(默认用户名和密码均为 nacos)
        username: nacos
        password: nacos

management:
  endpoints:
    web:
      exposure:
        # 激活 Spring Boot Actuator Endpoints
        include=*:

server:
  # 应用服务端口
  port: 8080

在启动类上添加 @EnableDiscoveryClient 注解。
启动类 ConsumerNacos8080.java

@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerNacos8080 {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerNacos8080.class, args);
    }
}

新增配置类,配置 RestTemplate 实例,并开启Ribbon客户端负载均衡
AppConfig.java

@Configuration
public class AppConfig {

    @Bean
    @LoadBalanced //开启Ribbon客户端负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

ConsumerController 提供一个业务接口 “/consumer/echo/{msg}” ,通过服务发现,调用微服务 service-provider 的 “/echo/{msg}” 接口。
因为已经开启了服务发现和Ribbon的负载均衡功能,所以在发送 http 请求时,我们只需要
ConsumerController.java

@RestController
public class ConsumerController {
    @Autowired
    public RestTemplate restTemplate;

    @GetMapping("/consumer/echo/{msg}")
    public String callEcho(@PathVariable String msg) {
        // 访问应用 service-provider 的 REST "/echo/{msg}"
        return this.restTemplate.getForObject("http://service-provider/echo/" + msg, String.class);
    }
}

3.4 演示服务发现

启动 consumer-nacos-8080、provider-naocs-8070 和 provider-naocs-8071,在nacos控制台的服务列表可以看到服务注册成功。

访问 http://localhost:8080/consumer/echo/naming-service ,调用两次可看到ribbon轮询的效果。


service-consumer 的请求日志中,获取了 service-provider 的服务实例列表 192.168.42.109:8071 和 192.168.42.109:8070:

2021-06-10 17:12:03.075  INFO 19288 --- [nio-8080-exec-1] c.n.l.DynamicServerListLoadBalancer      : DynamicServerListLoadBalancer for client service-provider initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=service-provider,current list of Servers=[192.168.42.109:8070, 192.168.8.109:8071],Load balancer stats=Zone stats: {unknown=[Zone:unknown;	Instance count:2;	Active connections count: 0;	Circuit breaker tripped count: 0;	Active connections per server: 0.0;]
},Server stats: [[Server:192.168.8.109:8071;	Zone:UNKNOWN;	Total Requests:0;	Successive connection failure:0;	Total blackout seconds:0;	Last connection made:Thu Jan 01 08:00:00 CST 1970;	First connection made: Thu Jan 01 08:00:00 CST 1970;	Active Connections:0;	total failure count in last (1000) msecs:0;	average resp time:0.0;	90 percentile resp time:0.0;	95 percentile resp time:0.0;	min resp time:0.0;	max resp time:0.0;	stddev resp time:0.0]
, [Server:192.168.42.109:8070;	Zone:UNKNOWN;	Total Requests:0;	Successive connection failure:0;	Total blackout seconds:0;	Last connection made:Thu Jan 01 08:00:00 CST 1970;	First connection made: Thu Jan 01 08:00:00 CST 1970;	Active Connections:0;	total failure count in last (1000) msecs:0;	average resp time:0.0;	90 percentile resp time:0.0;	95 percentile resp time:0.0;	min resp time:0.0;	max resp time:0.0;	stddev resp time:0.0]
]}ServerList:com.alibaba.cloud.nacos.ribbon.NacosServerList@c9c890c
2021-06-10 17:12:04.027  INFO 19288 --- [erListUpdater-0] c.netflix.config.ChainedDynamicProperty  : Flipping property: service-provider.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647

4. Nacos 服务发现 Open API

参考官网:https://nacos.io/zh-cn/docs/open-api.html

下面只介绍 服务注册、服务发现 还有 发送心跳,其它的请求可以参考Nacos官网。

4.1 注册一个实例到服务

请求类型: POST 
请求路径: /nacos/v1/ns/instance

示例请求

[root@localhost ~]# curl -X POST 'http://192.168.42.51:8848/nacos/v1/ns/instance?port=1001&healthy=true&ip=192.168.42.109&weight=1.0&serviceName=nacos-API&encoding=GBK&namespaceId=public'
ok
[root@localhost ~]# 

通过 open API 成功注册服务 nacos-API,服务列表多了 nacos-API 服务信息

服务详情可以看到我们配置的服务属性,如 ip : 192.168.42.109,port : 1001

4.2 查询服务列表

请求类型: GET
请求路径: /nacos/v1/ns/service/list

示例请求

http://192.168.42.51:8848/nacos/v1/ns/service/list?pageNo=1&pageSize=10

4.3 查询服务下的实例列表

请求类型: GET
请求路径: /nacos/v1/ns/instance/list

示例请求

http://192.168.42.51:8848/nacos/v1/ns/instance/list?serviceName=service-provider

4.4 发送某个实例的心跳

请求类型: PUT
请求路径: /nacos/v1/ns/instance/beat

示例请求

实例心跳内容:

{"cluster":"c1","ip":"192.168.42.109","metadata":{},"port":1001,"scheduled":true,"healthy":true,"serviceName":"nacos-API","weight":1}

心跳内容进行 URL编码后:

%7B%22cluster%22%3A%22c1%22%2C%22ip%22%3A%22192.168.42.109%22%2C%22metadata%22%3A%7B%7D%2C%22port%22%3A1001%2C%22scheduled%22%3Atrue%2C%22healthy%22%3Atrue%2C%22serviceName%22%3A%22nacos-API%22%2C%22weight%22%3A1%7D

发送 PUT 请求,服务 nacos-API 的 192.168.42.109:1001 实例的发送心跳成功

[root@localhost ~]# curl -X PUT '192.168.42.51:8848/nacos/v1/ns/instance/beat?serviceName=nacos-API&beat=%7B%22cluster%22%3A%22c1%22%2C%22ip%22%3A%22192.168.42.109%22%2C%22metadata%22%3A%7B%7D%2C%22port%22%3A1001%2C%22scheduled%22%3Atrue%2C%22healthy%22%3Atrue%2C%22serviceName%22%3A%22nacos-API%22%2C%22weight%22%3A1%7D'
{"clientBeatInterval":5000,"code":10200,"lightBeatEnabled":true}
[root@localhost ~]# 

在 nacos 控制台的 nacos-API 的服务详情中,可以看到健康状态是 true。

代码:
https://github.com/wengxingxia/006SpringCloud.git

[CSDN同步:SpringCloud-08-Alibaba Nacos服务注册与发现] https://blog.csdn.net/qq_20633779/article/details/117485612
[慕课手记同步:SpringCloud-08-Alibaba Nacos服务注册与发现] https://www.imooc.com/article/318243


欢迎关注文章同步公众号"黑桃",技术博文第一时间推送和PDF书籍分享

原文链接:https://blog.csdn.net/qq_20633779/article/details/117787668



所属网站分类: 技术文章 > 博客

作者:小胖子爱java

链接:http://www.javaheidong.com/blog/article/221878/82acc851c1a8a09ff99b/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

15 0
收藏该文
已收藏

评论内容:(最多支持255个字符)