Springcloudalibaba之Nacos服务注册和配置中心

一、Nacos是什么?

  一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,它是注册中心和配置中心的组合,提供了服务发现和服务健康检查、动态配置管理、动态 DNS 服务、服务和元数据管理几大功能,同时支持负载均衡功能,具有Eureka+Config+Bus的功能。这些组件的功能和使用方式在本专题其他章节有详细介绍,此处不再赘述。Ncaos与其他注册中心工具的对比如下:

  以下是nacos生态全景图:

  二、Nacos替代Eureka做服务注册中心

  1、下载安装:去https://github.com/alibaba/nacos/releases下载,下载完成后直接解压安装包,运行bin目录下startup.cmd,运行成功后直接访问http://localhost:8848/nacos即可展示登录页面(默认账号密码nacos)。要注意的是安装前需要本地Java8和Maven环境已经安装好。

  2、创建微服务模块:

    a.父工程引入Springcloudalibaba的jar包。

<! --spring cloud alibabg 2.1.0.RELEASE-->
<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>

    b.子模块引入nacos的jar包。

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

    c.配置yml文件,注册到nacos注册中心和暴露监控端点。

server:
   port: 9001
spring:
   application:
       name: nacos-test-provider
   cloud:
     nacps:
       discovery:
         server-addr: localhost:8848   #配置Nacos服务注册中心地址
management:
    endpoints:
       web:
         exposure:
           include: "*"

    如果微服务是消费者,还需要在yml中配置调用的微服务名称地址,配置如下:

#消费者将要去访间面微服务名称(注册成功进nacos的微服务提供者)
iservice-url:
   nacos-user-service: http://nacos-test-provider

    d.主启动类上增加@EnableDiscoveryClient注解。

    e.完成以上abc三步,基础的微服务模块搭建完成,接下来在服务提供者中编写服务接口代码和在消费者中编写调用代码,示例代码如下:

/*微服务消费者调用代码*/
@Restcontroller
public class ConsumerController
{ 
     @Resource
      private RestTemplate restTemplate;

     @value("${service-url.nacos-user-service}")
     private string serverURL;

     @GetMapping(value = "/consumer/nacos/{id}")
     public string getInfo(@Pathvariable("id") Long id)
   {
        return restTemplate.getForobject(serverURL+"/provider/nacos/"+id,String.class);
    }
}
/*微服务提供者接口代码*/
@Restcontroller
public class Providercontroller
{
        value("${server.port}")
        private string serverPort;

       @GetMapping(value = "/provider/nacos/{id}")
       public string getTest(@Pathvariable("id") Integer id)
     {
           return"我是微服务提供者,id="+id;
     }
}

    e.消费者通过微服务名称来调用提供者时,因为集群会有多个相同的微服务名称,会出现调用不明确的情况而报错,因此需要赋予RestTemplate负载均衡能力,实现方式是在消费者的ApplicationContextConfig配置文件的getRestTemplet()下增加@LoadBalanced注解。

@Configuration
public class Applicationcontextconfig
{
     @Bean
     @LoadBalanced
     public RestTemplate getRestTemplate()
    {
      return new RestTemplate();
    }
}

 三、Nacos替代Config做服务配置中心

  Config配置中心的配置文件通常是存储在git上的,而Nacos本身则提供了配置中心存储管理的功能,支持基础配置和分类配置。ncaos的配置中心设计思想与Config一样(请参考微服务之配置中心Config),在项目初始化时需要先从配置中心拉取配置来正常启动项目。

  1、安装nacos,参考前一节安装过程。

  2、创建微服务模块:

    a.引入jar包。

<! --nacos-config-->
<dependency> <grouprd>com.alibaba.cloud</groupld> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

    b.配置bootstrap.yml文件和application.yml文件。

server:
   port: 9001
spring:
application: name: nacos
-config-provider cloud: nacps: config: server-addr: localhost:8848 #配置Nacos服务配置中心地址 file-extension: yaml #指定yaml格式的配置文件 (nacos默认配置文件格式为{spring.application.name}-{spring.profile.active}.{spring.cLoud.nacos.config.file-extension},即  “服务名称-运行环境.配置文件扩展名” ) management: endpoints: web: exposure: include: "*"
spring:
   profiles:
     active:dev   #配置运行环境,这里表示开发环境,一般为dev、test、prod等

    c.主启动类上增加@EnableDiscoveryClient注解。

    d.编写获取配置文件的代码。

@Restcontroller
@Refreshscope   //支持Nacos,的动态刷新功能
public class Configclientcontroller
{
    @value("${config.info}")
    private string configinfo;

    @GetMapping("/config/info")
    public string getconfigInfo()
   {
      return configInfo;
   }
}

    e.在nacos后台页面新增 nacos-config-client-dev.yml文件(nacos默认配置文件格式为{spring.application.name}-{spring.profile.active}.{spring.cLoud.nacos.config.file-extension},即  “服务名称-运行环境.配置文件扩展名” ),并写入内容。如图

 

     经过以上步骤,我们启动服务就可以通过访问getconfigInfo()方法获取到配置文件信息了,nacos支持自带动态刷新功能。

  2、分类配置

  分类配置主要是用于多项目多环境管理,分类配置中存在Namespace、Group、Cluster的概念,Nacos默认的命名空间是public,Namespace主要用来实现隔离。Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去。一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。
  实现分组配置:在nacos配置中心页面创建配置文件时写上分组名称,然后修改bootstrap.yml文件中nacos.config.group=分组名称。

       实现命名空间配置:在nacos配置中心创建命名空间,记录下命名空间ID,然后修改bootstrap.yml文件中nacos.config.namespace=ID。

  如果不配置分组或者命名空间,nacos查找配置文件时会在默认分组或者默认命名空间下查找。

四、 Nacos理论AP和CP的选择

  nacos支持ap和cp两种理论模式,通常来说:

    如果不需要存储服务级别的信息且服务实例是通过nacos-cient注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring cloud 和Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。

    如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

   切换ap、cp模式的方式:

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

 五、Nacos集群

  默认nacos使用嵌入式数据库来实现数据的存储,如果要进行集群需要采用集中式的方式来支持集群化部署,目前nacos只支持MySQL数据库。nacos支持三种部署方式:单机模式、集群模式、多集群模式。单机模式用于测试,集群模式用于生产,多集群模式用于多数据中心。Nacos自带的嵌入式数据库是derby,可以切换为Mysql,以下是nacos集群架构图

  1、配置nacos到mysql数据库

    a.创建nacos的mysql数据库:在nacos/conf下找到nacos-mysql.sql文件复制代码到mysql数据库中去执行即可产生nacos_config数据库。

    b.配置nacos到mysql数据库连接:在nacos/conf下找到application.properties文件,加入如下配置代码后重启nacos。

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root db. password=123456

   2、集群配置步骤

    a.安装nacos-server到Linux系统,官方推荐使用Linux做集群部署,并且至少使用3个nacos集群节点。

    b.安装mysql数据库到Linux系统,配置nacos到mysql的连接,官方推荐使用高可用的mysql或者使用mysql集群。

    c.在nacos/conf下找到cluster.conf文件,打开输入前面安装的nacos-server地址集合,例如

192.168.0.101:3333
192.168.0.102:3333
192.168.0.103:3333

    d.配置nginx服务器,由它来作为负载均衡服务器,在nginx.conf中upstream nacoscluster节点上加入以上nacos地址,将location.proxy_pass指向 http://nacoscluster。

    e.完成以上配置后需要修改服务模块中指向nacos的地址为nginx服务器的地址。到此整个集群架构搭建完成。

 

posted @ 2021-10-16 15:34  我若安好,便是晴天  阅读(358)  评论(0编辑  收藏  举报