1. Nacos服务搭建

Nacos 是阿里巴巴的产品,现在是 SpringCloud 中的一个组件,是一个应用于服务注册与发现配置管理的平台。 地址:https://nacos.io/zh-cn/docs/quick-start.html

1.1 安装Nacos

  1. windows 在官网下载 nacos-server-1.4.1.zip并解压;
  2. nacos 的默认端口是8848,若被占用则修改 nacos/conf/application.properties文件;
  3. 启动Nacos,进入nacos/bin目录下:

    Lnux/Unix/Mac: 启动命令(standalone代表着单机模式运行,非集群模式): sh startup.sh -m standalone 如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行: bash startup.sh -m standalone Windows: 启动命令(standalone代表着单机模式运行,非集群模式): startup.cmd -m standalone

  4. 报错:

image.png

image.png
说明 jdk 的环境变量有问题
解决方法:
编辑startup.cmd文件,在其中手动指定 JAVA_HOME 的路径: :::info set JAVA_HOME=”D:\Java\jdk1.8.0_301”
if not exist “%JAVA_HOME%\bin\java.exe” echo Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better! & EXIT /B 1
set “JAVA=%JAVA_HOME%\bin\java.exe” :::

  1. 启动成功

image.png

  1. 进入Nacos客户端

    Nacos启动成功后会提示访问地址 访问地址:http://192.168.111.2:8848/nacos/index.html 账号:nacos 密码:nacos

image.png

  1. 关闭服务

    Lnux/Unix/Mac: sh shutdown.sh Windows: shutdown.cmd

2. 服务注册

  1. 在父工程添加 spring-cloud-alibaba 管理依赖 :::info
    <_dependency>
    <_groupId_>com.alibaba.cloud
    <_artifactId_>spring-cloud-alibaba-dependencies
    <_version_>2.2.5.RELEASE
    <_type_>pom
    <_scope_>import
    _ :::

  2. 添加 Nacos 客户端依赖 :::info
    <_dependency>
    <_groupId_>com.alibaba.cloud
    <_artifactId_>spring-cloud-starter-alibaba-nacos-discovery
    _ :::

  3. 修改 application.yml文件配置

    1. spring:
    2. application:
    3. name: user-service # user-service的服务名称
    4. cloud:
    5. nacos:
    6. server-addr: localhost:8848 # nacos服务端地址
  4. 启动并测试

image.png

3. 服务多级存储模型

  1. 一级是服务,例如:user-service
  2. 二级是集群,例如:BeiJing 或 HangZhou
  3. 三级是实例,例如:北京机房的某台部署了 user-service 的服务器

image.png
配置集群,修改application.yml文件配置

spring:
  application:
    name: user-service  # user-service的服务名称
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务端地址
      discovery:
        cluster-name: BeiJing  # 集群名称

服务调用尽可能选择本地集群的服务,跨集群调用延迟较高 本地集群不可访问时,再去访问其他集群

4. 负载均衡

4.1 NacosRule

这个规则会优先寻找与自己同集群的服务,同集群内采用随机方式

user-service:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

注意将服务提供者的权重都设置为1,再测试

4.2 设置权重

在 Nacos 控制台设置实例的权重值,首先选中实例后面的编辑按钮
image.png
image.png

  • 权重值在 0~1 之间
  • 同集群内的多个实例,权重越高被访问的频率越高
  • 权重设置为 0 则完全不会被访问

    5. 环境隔离

    Nacos 中服务存储和数据存储的最外层都是一个名为 命名空间namespace 的东西,用来做最外层隔离。 不同命名空间下的服务不可见

image.png
配置命名空间

  1. 在 Nacos 控制台新建命名空间

image.png

  1. 修改项目的配置文件

    spring:
    application:
     name: user-service  # user-service的服务名称
    cloud:
     nacos:
       server-addr: localhost:8848 # nacos服务端地址
       discovery:
         cluster-name: BeiJing  # 集群名称
         namespace: 6b084c59-6f93-4e96-bda8-167d71fd7b10 # 命名空间
         ephemeral: true # 是否是临时实例
    

    6. Nacos和Eureka对比

    image.png

  2. Nacos 与 Eureka 的共同点

    1. 都支持服务注册和服务拉取;
    2. 都支持服务提供者心跳方做健康检测;
  3. Nacos 与 Eureka 的区别
    1. Nacos 支持服务端主动监测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式;
    2. 临时实例心跳不正常会被删除,非临时实例则不会被剔除;
    3. Nacos 支持服务列表变更的消息推送模式,服务列表更新更及时;
    4. Nacos 集群默认才用 AP 方式,当集群中存在非临时实例时,采用 CP 模式;Eureka 采用 AP 模式;

      7. 统一配置管理

      7.1 新建配置

      DataID:命名规则与bootstrap.yml的配置项相同:[服务名]-[环境].[文件后缀]

7.2 获取配置

项目获取配置流程:
image.png

  1. 引入 Nacos 的配置管理客户端依赖:

    <!-- Nacos配置管理依赖依赖包 -->
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    
  2. 在项目的 resource 目录添加一个 bootstrap.yml文件,该文件是引导文件优先级高于 **application.yml** ```yaml spring: application: name: userservice # 服务名 profiles: active: test # 环境 cloud: nacos: server-addr: localhost:8848 # Nacos地址 config:

     file-extension: yaml  # 文件后缀
    

3. 编写测试代码
```java
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {


    @Value("${lagou.message}")
    private String message;

    @GetMapping("getTime")
    public String getTime() {
        System.out.println(message);
        return message;
    }
}
  1. 测试

image.png

7.3 配置热更新

Nacos 中的配置文件更改后,通过两种配置,微服务无需重启就可以感知:

  1. 方式一:在 @Value 注入的变量所在类上添加注解 @RefreshScope

image.png

  1. 方式二:使用 @ConfigurationProperties 注解

① 新建配置类

@Data
@Component
@ConfigurationProperties(prefix = "lagou")
public class LagouProperties {
    private String message;
}

② 使用

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private LagouProperties lagouProperties;

    @GetMapping("getValue")
    public String getValue() {
        return lagouProperties.getMessage();
    }
}

7.4 多环境共享

微服务启动时会从 Nacos 读取多个配置文件

  • [spring.application.name]-[spring.profiles-active].yaml,例如:userservice-test.yaml
  • [spring.application.name].yaml,例如:userservice.yaml

无论 profile 如何变化,[spring.application.name].yaml 这个文件一定会加载,因此多环境共享配置可以写入这个文件。
image.png
多种配置的优先级:

服务名-profile.yaml > 服务名.yaml > 本地配置

8. 集群搭建

image.png