一、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+"\t 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\nacos\conf目录下找到sql脚本.nacos-mysql.sql 

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

CREATE DATABASE nacos_config;
USE nacos_config;
-- 粘贴运行nacos-mysql.sql里面的脚本
  • nacos-server-1.1.4\nacos\conf目录下找到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

  高可用小总结

posted @ 2021-05-23 14:35  jingdy  阅读(190)  评论(0编辑  收藏  举报