欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心

程序员文章站 2022-06-13 11:45:07
...

Nacos 服务注册和配置中心

一、Nacos简介

1、是什么

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
Nacos:Dynamic Naming and Configuration service
就是注册中心+配置中心的组合
等价于
Nacos=Eureka+Config+Bus

2、能干嘛

替代Eureka做服务注册中心
替代Config做服务配置中心

3、去哪下

下载地址
中文官方文档地址
英文官方文档

4、各种注册中心比较

SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心

二、安装运行Nacos

1、本地Java8+Maven环境

2、官网下载Nacos

3、解压安装包,直接运行bin目录下的startup.cmd

4、命令运行成功后直接访问http://localhost:8848/nacos

默认登录账号密码都是nacos

5、结果页面

SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心

三、Nacos作为服务注册中心演示

1、官网文档

官方文档

2、基于Nacos的服务提供者

1)新建Module

cloudalibaba-provider-payment9001

2)POM

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

3)YML

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.0:8848 #配置Nacos地址

management:
  endpoints:
    web:
      exposure:
        inslude: '*'

4)主启动类

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9002 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain9002.class,args);
    }
}

5)业务类

package com.atguigu.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PaymentController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id){
        return "nacos registry, serverPort: "+serverPort+"\t id"+id;
    }
}

6)测试

http://localhost:9001/payment/nacos/1

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

如果想拷贝一个虚拟映射
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心

3、基于Nacos的服务消费者

1)新建 Module

cloudalibaba-consumer-nacod-order83

2)pom

同上

3)yml

server:
  port: 83
spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.0:8848

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

4)主启动类

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 {
    public static void main(String[] args) {
        SpringApplication.run(OrderNacosMain83.class,args);
    }
}

5)业务类

Config:

package com.atguigu.springcloud.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

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

Controller:

package com.atguigu.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
@Slf4j
public class OrderNacosController {

    //之前的写法
    //public static final String SERVER_URL="http://nacos-payment-provider";

    //实现配置和代码分离
    @Value("${service-url.nacos-user-service}")
    private String  serverURL;

    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id){
        return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
    }
}

6)测试

启动8848/9001/9002/83
http://localhost:83/consumer/payment/nacos/13

4、服务注册中心对比

1)Nacos全景图所示

SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心

2)Nacos和CAP

Nacos Eureka Consul CoreDNS Zookeeper
一致性协议 CP+AP AP CP / CP
健康检查 TCP/HTTP/MySQL/Client Beat Client Beat TCP/HTTP/gRPC / Client Beat
负载均衡 权重/DSL/metadata/CMDB Ribbon Fabio RR /
雪崩保护 支持 支持 不支持 不支持 不支持
自动注销实例 支持 支持 不支持 不支持 支持
访问协议 HTTP/DNS/UDP HTTP HTTP/DNS DNS TCP
监听支持 支持 支持 支持 不支持 支持
多数据中心 支持 支持 支持 不支持 不支持
跨注册中心 支持 不支持 支持 不支持 不支持
SpringCloud 集成 支持 支持 支持 不支持 不支持
Dubbo 集成 支持 不支持 不支持 不支持 支持
K8s集成 支持 不支持 支持 支持 不支持

SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心

3)切换

Nacos支持AP和CP模式切换
C是所有节点在同一时间看到的数据都是一致的(数据一致);而A的定义是多有的请求都会收到响应(高可用)
切换模式:

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

四、Nacos作为服务配置中心演示

1、Nacos作为配置中心-基础演示

1)新建cloudalibaba-config-nacos-client3377

2)pom

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

3)yml

俩个:
Nacos同SpringCloud-config一样 ,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置后,才能保证项目的正常启动。
bootstrap高于application
bootstrap.yml:

server:
  port: 3377

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


application.yml:

spring:
  profiles:
    active: dev #表示开发环境

4)主启动类

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377 {
    public static void main(String[] args) {
        SpringApplication.run(NacosConfigClientMain3377.class,args);
    }
}

5)业务类

package com.atguigu.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope //支持Nacos的动态刷新功能
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo(){
        return configInfo;
    }
}

6)在Nacos中添加配置信息

匹配规则:

1>理论:

Nacos中的dataid的组成格式及与SpringBoot配置文件中的匹配规则
官网地址
在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profile.active}.${file-extension}

SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心

2>实操

SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心
小总结:
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心

7)测试

http://localhost:3377/config/info

8)自带动态刷新

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

1)问题

多环境多项目管理
问题1
实际开发中,通常一个系统会准备
dev开发环境
test测试环境
prod生成环境
如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件?
问题2
一个大型分布式微服务系统会有很多微服务子项目,
每个微服务项目又都会相应的开发环境、测试环境、预发环境、正式环境等
怎么对这些微服务配置进行管理呢?

2)Nacos的图形化管理界面

3)Namespace+Group+Data ID 三者的关系,为什么这么设计

类似Java里面的package名和类名
最外层的namespace是可以用于区分部署环境的,Group和DataID逻辑上区分两个目标对象
三者情况:
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心
Nacos默认的命名空间是public,Namespace主要用来实现隔离的、
比方说我们现在又三个环境:开发、测试、生成环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。

Group可以把不同的微服务划分到同一个分组里面去。

Service就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Clulster是对指定微服务的一个虚拟划分。
比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,
这时就可以给杭州机房的Service微服务起一个集群名称(HZ),
给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。

最后Instance,就是微服务的实例

4)Case三种方案加载配置

1>DataID方案

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

默认命名空间+默认分组+新建dev和test两个不同的DataID

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

测试:
http://localhost:3377/config/info
配什么就加载什么

2>Group方案

通过Group实现环境区分——新建Group
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心

在nacos图形界面控制台上面新建配置文件DataID
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心
bootstrap+application

group: TEST_GROUP
3>Namespace方案

新建 dev/test的Namespace
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心
回到服务管理-服务列表查看
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心
按照域名配置填写

YML

namespace: 0d8e05fe-6fb9-4879-8e62-abcf0c411e16

测试:
http://localhost:3377/config/info

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

1、官网说明

官网

1)官网架构图:

SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心

2)上图翻译

SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心

3)说明

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

2、Nacos持久化配置解释

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

官网说明

2)derby到mysql切换配置步骤

1、nacos-server-1.1.4/nacos/conf目录下找到SQL脚本
nacos-mysql.sql
执行脚本

2、nacos-server-1.1.4/nacos/conf目录下找到application.properties
将如下代码追加到该文件后面


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=nacos_devtest
db.password=youdontknow

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

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

1)预计需要环境

1个Nginx+3个Nacos注册中心+1个Mysql

2)Nacos下载Linux版

下载地址
Linux版本,下载好上传到Linux系统中,

SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心
或者可以直接在Linux系统中下载
指令如下:

wget https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.tar.gz

下载完成解压

 tar -zxvf nacos-server-1.1.4.tar.gz

解压后的目录:
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心

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

1>Linux服务器上mysql数据库配置

SQL脚本:
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心
在Linux系统的mysql上运行该脚本
创建了如下表:
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心

2>application.properties配置

修改conf目录下的application.properties文件

vim application.properties

按i启动文件编辑
在后面追加如下配置

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=nacos_devtest
db.password=youdontknow

修改完以后按 Shift+:wq 保存文件

3>Linux服务器上 nacos的集群配置cluster.conf

复制文件 cluster.conf 并修改
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心
修改后cluster.conf文件内容为
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心
(你自己的ip及每个nacos的端口号)
注:这个ip不能写127.0.0.1,必须是Linux命令hostname -i 能够识别的IP

4>编辑Nacos的启动脚本startup.sh,使它能够接受不同的启动端口

目录:nacos/bin/startup.sh
集群启动,我们希望可以类似其他软件的shell命令,传递不同的端口号启动不同的nacos实例。
命令:startup.sh -p 3333 表示启动端口号为3333的nacos服务器实例,和上一步的cluster.conf配置的一致
具体操作

 cp startup.sh startup.sh.bk

先拷贝一份,防止改错
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心
修改完成
启动方法 :

startup.sh -p 3333
startup.sh -p 4444
startup.sh -p 5555
5>Nginx的配置,由它作为负载均衡器

目录conf/nginx.conf
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心
SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心

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

启动nginx和三台nacos

启动nacos:

./startup.sh -p 3333
./startup.sh -p 4444
./startup.sh -p 5555

查看nacos集群个数

ps -ef|grep nacos|grep -v grep|wc -l

在sbin目录下启动nginx(使用我们修改的配置文件)

./nginx -c /root/nginx-1.16.1/conf/nginx.conf

查看nginx是否启动

ps -ef|grep nginx

测试:
http://192.168.111.144:1111/nacos

4)测试

修改yml中的server-addr

server-addr: 192.168.111.144:1111

5)高可用小总结

SpringCloud Alibaba——高级(二)Nacos 服务注册和配置中心

相关标签: SpringCloud笔记