Nacos学习总结

Nacos 学习总结

微服务架构

为了适应企业的业务发展,软件架构现如今也做了升级和优化,将一个独立的系统拆分成若干个小的服务,每个服务都运行在不同的进程中,服务和服务之间采用RESTFul, RPC等协议传输数据,每个服务所拥有的功能具有独立性强的特点,这样的设计实现了服务之间的低耦合、服务内部的高内聚。

如下图所示,这是一个基于微服务架构的电商系统:

特点:

  1. 服务层按业务拆分为一个一个的微服务
  2. 微服务的职责单一
  3. 微服务之间采用RESTFul、RPC等轻量级协议传输
  4. 有利于前后端分离架构

服务发现流程

在上述的架构中,当微服务很多时,可能会出现A服务调用B服务,B服务调用C服务,C服务调用A服务,从而服务循环;微服务之间的调用需要有各个服务的地址,当某个服务出现升级或宕机的情况,服务实例网址可能会发生变化,因此就需要有服务发现。

服务发现流程引入了一个服务发现中心

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

Nacos

目前市面上用得比较多的服务中心有:Nacos、Eureka、Consul 和 Zookeeper

Nacos作为服务中心,相比较其他软件具有更多的功能特性,且从长远角度来看,Nacos会在以后的版本中会支持SpringCloud和Kubernetes的组合,填补两者之间的鸿沟。另外,Nacos计划实现Service Mesh,也是未来微服务发展的趋势。

Nacos特性

Nacos提供以下4功能:

  • 服务发现与服务健康检查

    Nacos使服务更容易注册,通过DNS和http端口更容易发现其他服务,Nacos提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。

  • 动态配置管理

    动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。消除了在更新配置时重新部署应用程序,这使配置的更改更加高效灵活。

  • 动态DNS服务

    Nacos提供基于DNS协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在Nacos上的服务以域名的方式暴露端口,让三方应用方便的查阅和发现。

  • 服务和元数据管理

    Nacos能让你以微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康检查、服务的流量管理、路由及安全策略。

Nacos 安装

Nacos依赖Java环境来运行,下载地址:

https://github.com/alibaba/nacos/releases

启动服务器:

Nacos的默认端口是8848,需要保证8848端口没有被其他进程占用;

进入安装程序的bin目录,启动命令(standalone代表单机模式运行,cluster代表集群模式):

startup.cmd -m standalone

默认用户名/密码:nacos/nacos

Restful服务发现

测试环境

Spring Cloud是一套微服务开发框架集合,使用Spring Cloud Alibaba实现解决:

  1. 服务发现客户端从服务发现中心获取服务列表
  2. 服务消费方通过负载均衡获取服务地址

nacos-discovery父工程

nacos-discovery父工程添加依赖管理:

<groupId>com.example.nacos</groupId>
<artifactId>nacos-discovery</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
    <module>nacos-restful-consumer</module>
    <module>nacos-restful-provider</module>
</modules>
<packaging>pom</packaging>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.1.3.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

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

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

服务注册

spring:
  application:
    name: nacos-restful-provider
  cloud:
    .nacos:
      discovery:
        server-addr: 127.0.0.1:8848
  1. 启动Nacos
  2. 启动服务注册应用
  3. 观察Nacos服务列表,nacos-restful-provider注册成功

服务发现

spring:
  application:
    name: nacos-restful-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

修改Controller中远程调用的代码:

@GetMapping(value = "/service")
public String service(){
    RestTemplate restTemplate = new RestTemplate();
    ServiceInstance serviceInstance = loadBalancerClient.choose(serviceId);
    URI uri = serviceInstance.getUri();
    String providerResult = restTemplate.getForObject(uri + "/service",String.class);
    return "consumer invoke | " + providerResult;
}
  1. 服务提供方将自己注册到服务注册中心
  2. 服务消费方从注册中心获取服务地址
  3. 进行远程调用

负载均衡

1. 服务器端均衡

在负载均衡器中维护一个可用的服务实例清单,当客户端请求来临时,负载均衡器按照某种配置好的规则从可用服务实例清单中选取一个去处理客户端的请求。例如Nginx

2. 客户端均衡

在发送请求时选择一个服务实例,然后进行访问

可以通过下面方式在服务消费方的配置文件中修改默认的负载均衡策略:

nacos-restful-provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

代码demo

详细链接:

https://gitee.com/dingyelf/mylearn_code/tree/master/nacos-discovery

posted @ 2022-03-06 22:48  bright_ye  阅读(186)  评论(0编辑  收藏  举报