zoukankan      html  css  js  c++  java
  • 一、SpringCloud Alibaba Nacos

    一、Nacos简介

      Nacos:分别为Naming和Configuration的前两个字母,最后的s为Service,一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心。Nacos就是注册中心+配置中心的组合,等价于,Nacos = Eureka+Config+Bus。所以Nacos能替代Eureka做服务注册中心,Nacos替代Config做服务配置中心。

      Nacos做服务注册中心与其他注册中心的比较

    二、安装并运行Nacos

    • 先从官网下载Nacos:https://github.com/alibaba/nacos/releases/tag/1.1.4
    • 解压安装包,直接运行bin目录下的startup.cmd
    • 命令运行成功后直接访问:http://localhost:8848/nacos
    • 默认账号密码都是nacos

    三、Nacos作为服务注册中心

    3.1、服务提供者

    • 新建Spring Boot 的Module名称 :cloudalibaba-provider-payment9001

    • pom.xml添加如下依赖

    <!--父POM-->
    <!--spring cloud alibaba 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>
    <!--本模块POM-->
    <dependencies>
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
      </dependency>
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.62</version>
      </dependency>
    </dependencies>
    • 编写application.yml
      server:
      port: 9001
      
      spring:
        application:
          name: nacos-payment-provider
        cloud:
          nacos:
            discovery:
              server-addr: localhost:8848 #配置Nacos地址
      
      management:
        endpoints:
          web:
            exposure:
              include: '*'
    •  主启动
    @EnableDiscoveryClient
    @SpringBootApplication
    public class PaymentMain9001 {
      public static void main(String[] args) {
        SpringApplication.run(PaymentMain9001.class,args);
      }
    }
    • 业务类
    @RestController
    public class PaymentController{
        @Value("${server.port}")
        private String serverPort;
    
        @GetMapping(value = "/payment/nacos/{id}")
        public String getPayment(@PathVariable("id") Integer id){
            return "nacos registry, serverPort: "+ serverPort+"	 id"+id;
        }
    }
    • 测试:http://lcoalhost:9001/payment/nacos/1;

      为了下一章节演示nacos的负载均衡,参照9001新建9002

    3.2、服务消费者

    • 新建Spring Boot 的Module名称:cloudalibaba-consumer-nacos-order83

    • pom.xml添加如下依赖

    <dependencies>
      <!--SpringCloud ailibaba nacos -->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
      </dependency>
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
      </dependency>
    </dependencies>

      为什么nacos支持负载均衡,因为nacos集成了netflix-ribbon。

    • 编写application.yml
    server:
      port: 83
    
    spring:
      application:
        name: nacos-order-consumer
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
    service-url:
      nacos-user-service: http://nacos-payment-provider
    • 主启动
    @EnableDiscoveryClient
    @SpringBootApplication
    public class OrderNacosMain83{
        public static void main(String[] args){
            SpringApplication.run(OrderNacosMain83.class,args);
        }
        
    @Bean @LoadBalanced
    public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
    • 业务类
    @RestController
    @Slf4j
    public class OrderNacosController{
        @Resource
        private RestTemplate restTemplate;
    
        @Value("${service-url.nacos-user-service}")
        private String serverURL;
    
        @GetMapping(value = "/consumer/payment/nacos/{id}")
        public String paymentInfo(@PathVariable("id") Long id){
            return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
        }
    }
    • 测试:http://localhost:83/consumer/payment/nacos/13;83访问9001/9002,轮询负载OK

    3.3、各种注册中心对比

      Nacos全景图所示

      各种注册中心对比

      C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。

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

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

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

    四、服务配置中心

    4.1、Nacos作为配置中心-基础配置

    • 新建Spring Boot 的Module名称:cloudalibaba-config-nacos-client3377

    • pom.xml添加如下依赖

    <dependencies>
      <!--nacos-config-->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
      </dependency>
      <!--nacos-discovery-->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      </dependency>
      <!--web + actuator-->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
      <!--一般基础配置-->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
      </dependency>
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
      </dependency>
    </dependencies>
    • 编写application.yml

      nacos和Springcloud-config一样,在项目初始时,要保证先从配置中心进行配置拉去,拉去配置之后,才能保证项目的正常启动。

      Springboot中配置文件的加载时存在优先级顺序的,bootstrap优先级高于application。

    1、编写bootstrap.yml  

    server:
      port: 3377
    
    spring:
      application:
        name: nacos-config-client
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848 #服务注册中心地址
          config:
            server-addr: localhost:8848 #配置中心地址
            file-extension: yaml #指定yaml格式的配置

    2、编写application.yml

    spring:
      profiles:
        active: dev
    • 主启动
    @EnableDiscoveryClient
    @SpringBootApplication
    public class NacosConfigClientMain3377{
        public static void main(String[] args) {
            SpringApplication.run(NacosConfigClientMain3377.class, args);
        }
    }
    • 业务类
    @RestController
    @RefreshScope
    public class ConfigClientController{
        @Value("${config.info}")
        private String configInfo;
    
        @GetMapping("/config/info")
        public String getConfigInfo() {
            return configInfo;
        }
    }

      通过Spring Cloud原生注解@RefreshScope实现配置自动更新

      通过官网: https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html;查看如何在Nacos中添加配置信息

     

    • 配置:设置DataId

      • 公式${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}

      • prefix默认为spring.application.name的值

      • spring.profile.active既为当前环境对应的profile,可以通过配置项spring.profile.active 来配置

      • file-exetension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension配置

      总结说明

    • 测试

      • 启动前需要在nacos客户端-配置管理-配置管理栏目下有没有对应的yaml配置文件

      • 运行cloud-config-nacos-client3377的主启动类

      • 调用接口查看配置信息 http://localhost:3377/config/info

    • 自带动态刷新

      • 修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新

    4.2、Nacos作为配置中心-分类配置

    (1)、多环境多项目管理的问题

    问题1 问题2

    实际开发中,

    通常会为一个系统准备多套环境dev/test/prod

    如何保证指定环境启动时服务能够正确读取到Nacos上相应环境的配置文件呢

    一个大型分布式服务费系统会有很多微服务子项目,

    每个微服务项目有都会有相应的开发环境,测试环境、正式环境....

    那么怎么对这些微服务配置进行管理呢。

       首先看下nacos的管理页面

      配置列表中的dataID、group和命名空间namespace三者关系?

    • Namespace+Group+Data ID
    • 类似Java里面的package名和类名,最外层的namespace是可以用来区分部署环境的Group和DataID逻辑上区分两个目标对象。
    • 默认情况:
      • NameSpace=public,Group=DEFAULT_GROUP,默认Cluster是DEAFAULT。
      • Nacos默认的命名空间是public,Namespace主要用来实现隔离。比方说我们现在有三个环境:开发、测试、生产环境,那么我们就可以创建三个Namespace,不同的NameSpace之间是隔离的。
      • Group默认是DEFAULT_GROUP,GROUP可以把不同的微服务划分到同一个分组里面去。
      • service就是微服务:一个service可以包含多个Cluster(集群),Nacos默认Cluster是DEAFAULT,Cluster是对指定微服务的一个虚拟划分。比方说为了容灾,将Service微服务分别部署在杭州机房和广州机房。这时给杭州机房的Service微服务起一个集群名称(HZ),给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务相互调用,以提升性能。
      • 最后是Instance(微服务的服务实例)

    (2)、案例

    ①、DataID方案

    • 指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置

    • 默认空间+默认分组+新建dev和test两个DataID

    1、新建dev配置DataID

    2、新建test配置DataID

    3、通过spring.profile.active属性就能进行多环境下配置文件的读取

    4、测试

    • http://localhost:3377/config/info  
    • bootstrap.yml中配置是什么就加载什么

    ②、Group方案

      通过Group实现环境区分

    1、新建Group

    2、在nacos图形界面控制台上面新建配置文件DataID

      

    3、修改bootstrap+application

      在config下增加一条group的配置即可。可配置为DEV_GROUP或TEST_GROUP

    ③、Namespace方案

    1、新建dev/test的Namespace

    2、回到服务管理-服务列表查看

    3、按照域名配置填写

    五、Nacos集群和持久化配置(重点)

    5.1、官网说明

      https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

      集群部署机构图

      因此开源的时候推荐用户把所有服务列表放到一个vip(虚拟IP,可以使用Nginx)下面,然后挂到一个域名下面。

      说明:https://nacos.io/zh-cn/docs/deployment.html

      默认Nacos使用嵌入式数据库实现数据的存储,所以,如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储

      Nacos支持三种部署模式:

      • 单机模式:用于测试和单机试用
      • 集群模式:用于生产环境,确保高可用
      • 多集群模式:用于多数据中心场景 

      单机模式支持mysql:在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况,0.7版本增加了支持mysql数据源能力,具体的操做步骤如下:

      1. 安装数据库,版本要求5.6.5+
      2. 初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
      3. 修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysl数据源的url、用户名和密  
    spring.datasource.platform=mysql
    
    db.num=1
    db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
    db.user= 
    db.password= 

      再以单机模式启动nacos,nacos所有写嵌入式数据库的数据都写到mysql     

    5.2、Nacos持久化配置解释

    (1)、Nacos默认自带的是嵌入式数据库derby

      https://github.com/alibaba/nacos/blob/develop/config/pom.xml

    (2)、derby到mysql切换配置步骤

    • nacos-server-1.1.4 acosconf目录下找到sql脚本.nacos-mysql.sql 

      注意:此时自己需要创建一个库。

    CREATE DATABASE nacos_config;
    USE nacos_config;
    -- 粘贴运行nacos-mysql.sql里面的脚本
    • nacos-server-1.1.4 acosconf目录下找到application.properties修改存储库
    spring.datasource.platform=mysql
    
    db.num=1
    db.url.0=jdbc:mysql://localhost:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
    db.user=root 
    db.password=root

      启动nacos,可以看到是个全新的空记录界面,以前是记录进derby

     5.3、Linux版Nacos+MySQL生产环境配置

      预计需要,1个nginx+3个nacos注册中心+1个mysql

    (1)、预备环境准备

    • 64 bit OSlinux/unix/Mac,推荐使用linxu

    • 64 bit JDK 1.8+

    • Maven 3.2x+

    • 3个或者3个以上nacos节点才能构成集群

    (2)、下载源码或者安装包

      Nacos下载linux版本 https://github.com/alibaba/nacos/releases/tag/1.1.4

      nacos-server-1.1.4.tar.gz

      解压后安装

    (3)、集群配置步骤(重点)

     ①、Linux服务器上mysql数据库配置

    • SQL脚本存放位置
    ll /usr/local/nacos/conf/

      自己Linux机器上的Mysql数据库创建库,粘贴运行脚本

    ②、application.properties文件

    • 位置和mysql脚本在同一目录下

    • application.properties添加如下内容

    spring.datasource.platform=mysql
     
    db.num=1
    db.url.0=jdbc:mysql://192.168.126.139:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
    db.user=root
    db.password=root
    # mysql  授权远程访问
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
    flush privileges;

    ③、Linux服务器上nacos的集群配置cluster.conf

    • 梳理出3台nacos机器的不同服务端口

    • 复制出cluster.conf

    vim cluster.conf

      这个IP不能写127.0.0.1,必须是Linux命令hostname -i能够识别的IP
    ④、
    编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端

    • /nacos/bin目录下有startup.sh;平时单机版的启动,都是./startup.sh即可。但是集群的启动,我们希望可以类似其他软件的shell命令,传递不同的端口号启动不同的nacos实例。命令:./startup.sh -p 3333表示启动端口号为3333的nacos服务实例,和上一步的cluster.conf配置的一致。

    • 修改内容

    vim /usr/local/bin/startup.sh

    • 执行

    ⑤、Nginx的配置,由它作为负载均衡器

      修改nginx的配置文件

    upstream cluster{                                                        
    		server 192.168.126.140:3333;
    		server 192.168.126.140:4444;
    		server 192.168.126.140:5555;
    	}
    
    server{
                              
    
        listen 1111;
        server_name localhost;
        location /{
             proxy_pass http://cluster;                                                 
        }
    
    ....省略  

      按照指定启动

    /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf.nacos 

    ⑥、截止到此处,1个Nginx+3个nacos注册中心+1个mysql

      测试通过nginx访问nacos:https://192.168.126.138:1111/nacos/#/login

      新建一个配置测试

    ⑦、测试

      微服务cloudalibaba-provider-payment9002启动注册进nacos集群

      yam文件

    server-addr:  写你自己的虚拟机ip:1111

      高可用小总结

  • 相关阅读:
    grub
    init
    内核的ramdisk
    kernel信息及其相关命令
    mvc和mvvm模式
    vue从零开始(一)
    echarts自动播放图形
    echarts自定义悬浮框的显示
    typescript入门
    echarts的最外层配置项
  • 原文地址:https://www.cnblogs.com/jdy1022/p/14690889.html
Copyright © 2011-2022 走看看