SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记

2023年2月2日10:58:11

一.SpringCloud Alibaba能干嘛??

SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记
下载地址:https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

二.SpringCloud Alibaba Nacos服务注册与配置中心

1.Nacos简介

Naming和Configuration的前两个字母,最后的设为Service.
Nacos:是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。简单的说就是注册中心+配置中心的组合.
Nacos替代了Eureka做服务注册中心,替代了Config做服务配置中心

2.Nacos下载安装

下载地址:https://github.com/alibaba/nacos/releases
安装条件:本地java8 + Maven环境
解压后直接运行bin目录下的startup.cmd
访问:http://localhost:8848/nacos可以进入nacos页面表示安装成功.

3.Nacos作为服务注册中心演示

①构建基于Nacos的服务提供者

因为各个微服务都需要alibaba-cloud的依赖,所以先直接将该依赖添加到父工程上

<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>
 

1️⃣.在服务提供者的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>
     </dependencies>

2️⃣.在yml中添加配置:(可以参考官网)

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  # 配置Nacos地址
management:
  endpoints:
    web:
      exposure:
        include: '*'

3️⃣.写主启动类

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

4️⃣.业务类

@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;
    }
}

5️⃣.为了演示集群和负载均衡,可以再建几个服务提供者
也可以这么操作
SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记
SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记

②构建基于Nacos的服务消费者

1️⃣.因为之前已经在父工程下引入了alibaba-cloud的依赖了.所以这不用在引入,只需要在pom中引入nacos的依赖

  <dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </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>

2️⃣.在application.yml中添加配置

server:
  port: 83

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

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

3️⃣主启动
4️⃣Nacos集成了Ribbon,稍后会用到RestTemplate调用服务提供者,所以着了在向容器中注入一个RestTemplate的Bean

@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced  //有两个被调用的服务时不开启负载均衡会报错,因为RestTemplate不知道自己要去调用那个
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

5️⃣.业务类

@SpringBootApplication
@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);
    }
}

6️⃣测试:
访问:http://localhost:83/consumer/payment/nacos/13
不断刷新,可以发现输出的端口号以轮询的方式变化;
结论:Nacos默认支持轮询方式的负载均衡;

4Nacos的AP和CP切换

SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记

5.Nacos作为服务配置中心演示

以前可以通过Config 结合Bus将配置文件放到GitHub上统一配置,实现自动刷新和动态的更新。
现在可以用Nacos替代Config做服务配置中心,将配置写进Nacos,

①Nacos作为配置中心–基础配置

1️⃣新建module,在pom中引入依赖

<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>
 

2️⃣添加bootstrap.yml和application.yml
为什么添加两个yml?:
Nacos同SpringCloud Config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置后,才能保证项目的正常启动.
springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
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格式的配置

application.yml

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

3️⃣主启动类

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

4️⃣业务类

@RestController
@RefreshScope  //支持Nacos的动态刷新功能
public class ConfigClientController {
    
    @Value("${config.info}")
    private String configInfo;
    
    @GetMapping("/config/ingo")
    public String getConfigInfo(){
        return configInfo;
    }
}

5️⃣在Nacos中添加配置信息
配置规则:
SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记
SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记

SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记
添加配置文件界面:
SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记
6️⃣.启动配置好的配置中心服务,
访问:http://localhost:3377/config/info
7️⃣Nacos作为服务配置中心自带动态刷新功能;
不用向Config那样还要发送post请求更新…

②Nacos作为配置中心–分类配置

实际开发中,通常一个系统会准备dev开发环境,test测试环境,prod生产环境.
或者,一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又会有相应的开发环境,测试环境预发环境和正式环境…
需要对这些微服务配置进行管理
Nacos可以实现配置的分类管理
Nacos默认的命名空间是public,Namespace主要用来实现隔离.–dev /test/prod
Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个组里面.

三种方案加载配置

1️⃣DataId方案
SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记
SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记
2️⃣Group方案
SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记
然后咋config下新增一条group的配置即可—用那个group配置就写哪个,⬇
SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记
3️⃣.Namespace方案
(1) 新建dev/testde Namespace
(2) 在两个命名空间下可以分别建不同的group,以及DataId的配置文件
(3) 在bootstrap.yml下配置:
SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记

6.Nacos集群和持久化配置

实际工作中不可能只用一台Nacos微服务运行,万一挂了怎么办?所以必须Nacos配置集群;而且Nacos宕机后有些配置数据重启后需要保留的,所以持久化的配置也是必须的.
由于Nacos自带嵌入式数据库derby,如果配置集群后,每个节点都会有一个数据库,这样的话数据一致性就很难保证了,所以需要将Nacos默认的数据库迁移到MySQL上(Nacos采用了集中式存储的方式来支持集群化部署,目前只支持Mysql的存储).

①Derby切换到Mysql(持久化配置)

1️⃣在 nacos\conf目录下找到sql脚本nacos-mysql.sql,执行该脚本
2️⃣修改conf/application.properties文件,增加支持mysql数据源配置,添加mysql数据源的url,用户名和密码:

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

3️⃣重启nacos后之前配置的配置信息就空白了,以后再存配置信息就会存到mysql中了

注意:mysql版本必须为5.6.5+

②搭建Nacos集群

官网明确提出:需要至少三个Nacos,
1️⃣.梳理出三台nacos机器的不同端口号
在conf目录下复制出一个cluster.conf,更改里面ip的端口,
如果是在Linux环境下,不能写127.0.0.1,必须是Linux命令hostname -i能识别的ip,
SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记
2️⃣.因为Nacos默认是单机版启动,所以需要手动改成集群启动,在bin下的startup.cmd文件中修改
SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记
3️⃣.在将nacos复制两份,文件名最好都以端口命名,好区分
SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记
然后分别将它们各自的conf下的application.properties文件中的server.port分别改为8848,8849,8850;
4️⃣.分别启动这三个nacos,到bin下点击startup.cmd即可启动
windows环境下的nacos搭建完毕.

③用Nginx作负载均衡器

1️⃣.windows下的Nginx启动方式必须用cmd命令启动,直接点击nginx.exe文件会报错,如果不小心双击了,需要在资源管理器中结束ngins的进程;或 者使用如下相关指令操作:

SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记
2️⃣.修改nginx.conf文件
SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记
3️⃣.启动Nginx,cmd: start nginx
测试: 由于在nginx.conf文件中监听端口为1111,所以访问localhost:1111/nacos即可
4️⃣.修改微服务的配置:
SpringCloud Alibaba Nacos服务注册与配置中心_学习笔记

资料分享:来自站点外:windows下Nginx的部署:
windows下nacos的集群搭建

  • 作者:滨海之君
  • 原文链接:https://blog.csdn.net/qq_40084325/article/details/108479215
    更新时间:2023年2月2日10:58:11 ,共 7923 字。