Nacos学习及使用

nacos是阿里的一个开源产品,是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。(用来实现配置中心和服务注册中心)

1 、四大功能

服务发现和服务健康监测(使服务更容易注册,并通过DNS或HTTP接口发现其他服务,还提供服务的实时健康检查,以防 止向不健康的主机或服务实例发送请求。 )

  • 支持基于DNS和基于RPC的服务发现。服务提供者使用原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
  • Nacos提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

动态配置服务

  • 以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
  • 消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
  • 配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
  • 提供了一个简洁易用的UI (控制台样例 Demo) 帮助管理所有的服务和应用的配置。
  • Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,能更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

动态 DNS 服务

  • 动态 DNS 服务支持权重路由,更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能更容易地实现以 DNS 协议为基础的服务发现,消除耦合到厂商私有服务发现 API 上的风险。
  • Nacos 提供了一些简单的 DNS APIs TODO ,管理服务的关联域名和可用的 IP:PORT 列表

服务及其元数据管理
从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据

2、动态配置

Nacos引用命名空间、分组、dataId来管理配置和注册的服务, Namespace + Group + DataId 三者关系 类似 Java 里面的 package 包名和类名

命名空间

命名空间,即 Namespace,用于进行粗粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
Nacos 中存在一个默认的命名空间 public,所有配置以及服务注册,在没有指定命名空间时都会默认从 public 这个命名空间拉取配置以及注册到该命名空间下的注册表中。
我这里新建一个nacosStudy命名空间,当然一般情况下是建dev、test和pro这种。
Nacos学习及使用_第1张图片
Group
是对配置进行分组,在nacosStudy空间下,新建了一个producter-discovery.properties,group是producter的配置文件
Nacos学习及使用_第2张图片

springboot整合nacos

创建一个父工程,其pom配置为

    <properties>
        <java.version>1.8java.version>
        <spring.boot-version>2.3.2.RELEASEspring.boot-version>
        <spring.cloud-version>Hoxton.SR9spring.cloud-version>
        <spring.alibaba.cloud-version>2.2.6.RELEASEspring.alibaba.cloud-version>
        <druid.version>1.2.5druid.version>
    properties>

    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-dependenciesartifactId>
                <version>${spring.boot-version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring.cloud-version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>${spring.alibaba.cloud-version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            
            <dependency>
                <groupId>com.alibabagroupId>
                <artifactId>druid-spring-boot-starterartifactId>
                <version>${druid.version}version>
            dependency>
        dependencies>
    dependencyManagement>

创建子工程nacos-discovery引用父工程,其pom配置为

    <parent>
        <artifactId>nacosStudyartifactId>
        <groupId>com.lijiegroupId>
        <version>0.0.1-SNAPSHOTversion>
        <relativePath/> 
    parent>
    <artifactId>nacos-discoveryartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>nacos-discoveryname>
    <description>Demo project for Spring Bootdescription>
    <packaging>jarpackaging>

    <properties>
        <java.version>1.8java.version>
    properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starterartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>

        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-contextartifactId>
        dependency>
    dependencies>

nacos-discovery工程新建一个bootstrap.properties配置文件,内容为

#项目名称
spring.application.name=producter-discovery
#nacos服务发现地址
spring.cloud.nacos.discovery.server-addr=192.168.40.59:8848
#nacos服务发现命名空间 
spring.cloud.nacos.discovery.namespace=f0fe0beb-7c1f-4808-aa21-5f27509e4af7
#启用nacos配置中心的配置
spring.cloud.nacos.config.enabled=true
#取nacos配置文件名称
#spring.cloud.nacos.config.prefix=${spring.application.name}
#指定nacos配置中心的命名空间
spring.cloud.nacos.config.namespace=f0fe0beb-7c1f-4808-aa21-5f27509e4af7
#指定nacos配置中心的分组
spring.cloud.nacos.config.group=producter
#指定nacos配置中心的ip地址
spring.cloud.nacos.config.server-addr=192.168.40.59:8848
#指定nacos配置文件格式
spring.cloud.nacos.config.file-extension=properties

启动nacos-discovery,发现端口已经变成1818,成功读取nacos的配置文件
Nacos学习及使用_第3张图片

3、服务注册与发现

在微服务架构中一个业务流程需要多个微服务通过网络接口调用完成业务处理,服务消费方从服务注册中心获取服 务提供方的地址,从而进行远程调用,这个过程叫做服务发现。

由于微服务架构下各个服务部署的网络、地点、节点个数不同。服务消费方没方法准确记录服务的IP,所以需要一个服务发现中心,动态的获取服务提供方信息。

服务发现过程:

  1. 在每个服务启动时会向服务发现中心上报自己的网络位置。在服务发现中心内部会形成一个服务注册表,服务注册表是服务发现的核心部分,是包含所有服务实例的网络地址的数据库。
  2. 服务发现客户端会定期从服务发现中心同步服务注册表 ,并缓存在客户端。
  3. 当需要对某服务进行请求时,服务实例通过该注册表,定位目标服务网络地址。若目标服务存在多个网络地址,则使用负载均衡算法从多个服务实例中选择出一个,然后发出请求。

上面的 producter-discovery 服务配置了 spring.cloud.nacos.discovery.server-addr ,已经在nacos注册了服务。
Nacos学习及使用_第4张图片
写一个简单的controller方法

@RestController
@RequestMapping("/Demo")
public class DemoController {

    @GetMapping("/nacos")
    public String nacos(){
        return "producter-1818";
    }
}

前端访问
Nacos学习及使用_第5张图片

其他服务消费

新建一个 consumer-discovery服务。测试调用producter-discovery接口。pom配置文件和producter-discovery一致。bootstrap.properties内容为

spring.application.name=consumer-discovery

spring.cloud.nacos.discovery.server-addr=192.168.40.59:8848
spring.cloud.nacos.discovery.namespace=f0fe0beb-7c1f-4808-aa21-5f27509e4af7

启动consumer-discovery服务,在nacos查看

Nacos学习及使用_第6张图片
调用producter-discovery接口

@RestController
public class DemoController {
    @Resource
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("Demo")
    public String Demo(){
        RestTemplate restTemplate = new RestTemplate();
        //调用服务
        //String providerResult = restTemplate.getForObject("http://localhost:1818/Demo/nacos",String.class);

        ServiceInstance serviceInstance = loadBalancerClient.choose("producter-discovery");
        URI uri = serviceInstance.getUri();
        String providerResult = restTemplate.getForObject(uri+"/Demo/nacos",String.class);
        return "consumer invoke | " + providerResult;
    }

}

Nacos学习及使用_第7张图片
这里可以看到,我们没有记录producter-discovery服务的IP和端口号来,而是通过在nacos注册的服务名来动态的获取服务实例。当该服务名下有多个实例时,loadBalancerClient按照负载均衡的策略获取一个健康的服务实例,然后再通过服务实例的 IP 和端口,调用实例方法,从而完成服务请求。
一般项目中并不会这样调用其他服务的请求,而是使用Dubbo或feign

个人小站:什么是快乐,欢迎访问

你可能感兴趣的:(springcloud,java,开发语言)