一、初始Nacos

  1. Nacos是阿里开源的易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
  2. Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理
  3. 官网:https://nacos.io/zh-cn/docs/deployment.html
  4. github下载:https://github.com/alibaba/nacos/releases

    1、 Nacos支持三种部署模式

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

    2、单机模式下运行Nacos

  1. 下载 jar包
  2. 默认集群启动,使用命令单机模式启动 Nacos

    1. sh startup.sh -m standalone
  3. http://127.0.0.1:8848/nacos 进入后台,默认密码 nacos

    二、Nacos作为服务注册中心

    1、将微服务注册到Nacos

  4. 创建模块 cloudalibaba-producer-payment9001

  5. 写pom

    1. <dependency>
    2. <groupId>com.alibaba.cloud</groupId>
    3. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    4. </dependency>
  6. 写yml ```yaml server: port: 9001

spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848

暴露服务

management: endpoints: web: exposure: include=*:


4. 主启动类
```java
@SpringBootApplication
@EnableDiscoveryClient
public class AlibabaProducer9001 {
    public static void main(String[] args) {
        SpringApplication.run(AlibabaProducer9001.class, args);
    }
  1. 业务类

    @RestController
    public class PaymentController {
     @Value("${server.port}")
     private String serverPort;
    
     @GetMapping(value = "/payment/nacos/{id}")
     public String getPayment(@PathVariable("id") Integer id) {
         return "nacos----serverPort: " + serverPort + "\t id" + id;
     }
    }
    
  2. 测试进入Nacos服务器后台查看:http://localhost:8848/nacos/

    2、消费端使用Nacos

  3. 注入依赖

         <!--web-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
    
         <!--nacos-discovery-->
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
             <version>2021.1</version>
         </dependency>
    
         <!--openfeign-->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-openfeign</artifactId>
         </dependency>
    
         <!--负载均衡-->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-loadbalancer</artifactId>
         </dependency>
    

    ```yaml server: port: 80

spring: application: name: service-user-consumer cloud: nacos: discovery: server-addr: 127.0.0.1:8848

输入debug日志

logging: level: com.tao.project.service.*: debug


2. 启动类
```java
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class Application80 {
    public static void main(String[] args) {
        SpringApplication.run(Application80.class, args);
    }
}
  1. 编写消费端的服务类、控制器;加入负载均衡策略

    @Component
    @FeignClient(value = "service-user-provider")
    public interface UserFeignService {
     /**
      * 根据ID查用户信息
      *
      * @param userId
      * @return
      */
     @GetMapping("/provider/user/{id}")
     String findById(@PathVariable("id") Integer userId);
    
     /**
      * 超时方法
      * @param userId
      * @return
      */
     @GetMapping("/provider/user/{id}/timeout")
     String getUserByTimeOUt(@PathVariable("id") Integer userId);
    }
    
    @RestController
    @RequestMapping("consumer")
    public class UserController {
    
     @Autowired
     private UserFeignService userFeignService;
    
     /**
      * 获取用户信息
      *
      * @param id
      * @return 需要和 FeignService 对应
      */
     @GetMapping("/user/{id}")
     public String getUser(@PathVariable("id") Integer id) {
         return userFeignService.findById(id);
     }
    
     @GetMapping("/user/{id}/timeout")
     public String getUserByTimeOUt(@PathVariable("id") Integer id) {
         return userFeignService.getUserByTimeOUt(id);
     }
    }
    
    @Configuration
    public class ApplicationConfig {
     @Bean
     @LoadBalanced
     public RestTemplate restTemplate(){
         return new RestTemplate();
     }
    }
    

    2、支持AP和CP模式切换(Nacos)

    1. Nacos全景图

    image.png

    2. Nacos和其他注册中心特性对比

    image.png

    3. 何时选择使用何种模式?

    C是所有节点在同一时间的数据是一致性的;而A是所有的请求都可用,因此:

  • 如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。
  • 如果需要存储/编辑服务级别、配置信息,那么CP是必须的,K8S和NDS服务就适用于CP模式。

    三、Nacos作为配置中心

    1、配置中心

    Nacos 不需要建立服务器,只需要手动在nacos上创建配置文件 nacos-config-client-dev.yaml,命名规则为 spring application name-profile-yaml.
    config:
    info: “config info for dev, version = 1”
    

    2、客户端读取

  1. 创建模块
  2. 写pom

         <!--web-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
    
         <!--nacos-discovery-->
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
         </dependency>
    
         <!--nacos-config-->
         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
         </dependency>
    
         <!--加载bootstrap配置文件-->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-bootstrap</artifactId>
         </dependency>
    
  3. 注意要用 bootstrap.yml ```yaml server: port: 3377

spring: application: name: nacos-user profiles: active: dev cloud: nacos:

  # 注册中心
  discovery:
    server-addr: 127.0.0.1:8848
  # 配置中心
  config:
    server-addr: 127.0.0.1:8848
    # 指定配置文件后缀
    file-extension: yaml
    # 命名空间
    namespace: 253c8c05-5a95-4676-b1f6-f8525ffe72dc

4. 主启动类
```java
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfig3377 {
    public static void main(String[] args) {
        SpringApplication.run(NacosConfig3377.class, args);
    }
}
  1. 业务类

    @RestController
    @RefreshScope //自动刷新
    public class ConfigClientController {
     @Value("${config.info}")
     private String configInfo;
    
     @GetMapping("/config/info")
     public String getConfigInfo() {
         return configInfo;
     }
    }
    
  2. 测试:访问 http://localhost:3377/config/info ,在修改过发现能够自动更新配置文件,实现了bus的功能。

    3、配置文件读取规则

    ${prefix}-${spring.profiles.active}.${file-extension}
    
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile。当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
  • 通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新

    4、多环境多项目配置

    image.png
    配置中心的配置查找顺序:NameSapce->Group->DataID

    1. DataId

    image.png

    2. Group

    image.png

    3. NameSapce

    image.png

四、Nacos持久化配置

  1. 切换Nacos嵌入式数据库derby为mysql:修改配置文件 ```bash spring.datasource.platform=mysql

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

<a name="dUQqP"></a>
# 五、Nacos集群配置
<a name="orb1c"></a>
## 1、架构
![image.png](https://cdn.nlark.com/yuque/0/2021/png/21567217/1623301799150-ecb84dc2-3b43-426f-b0c4-55bea5b709be.png#clientId=u31116ca3-39a5-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=329&id=uc169cca4&margin=%5Bobject%20Object%5D&name=image.png&originHeight=845&originWidth=1319&originalType=binary&ratio=2&rotation=0&showTitle=false&size=467627&status=done&style=none&taskId=uebec8a00-8434-4637-9a8f-2c1d9b56eb4&title=&width=513.5)<br />1 Nginx + 3 Nacos + 1 MySQL
<a name="umv03"></a>
## 2、配置 Nacos集群

1. `vim cluster.conf` 将所有集群写入到该文件
```bash
192.168.69.150:3333
192.168.69.150:4444
192.168.69.150:5555
  1. 开启端口映射模拟多个主机:vim ./bin/start.sh 添加以下配置,开启端口映射启动

image.png

nohup $JAVA -Dserver.port=${EMBEDDED_STORAGE} ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &
  1. start.sh改为集群模式启动

    3、Nginx配置

  2. 修改Nginx配置文件:Nginx.conf

image.png

 upstream cluster{

  server 127.0.0.1:3333;
  server 127.0.0.1:4444;
  server 127.0.0.1:5555;
  }

  server {
    listen   1111;
    server_name localhost;

    #charset koi8-r;

    #access_log logs/host.access.log main;

    location / {
      #root html;
      #index index.html index.htm;
      proxy_pass http://cluster;
    }
    ....
  }
  1. 启动Nginx

    /usr/local/nginx/nginx -c /usr/local/nginx/nginx.conf
    
  2. 测试:http://192.168.59.150:1111/nacos/ ,现在即可正常访问Nacos集群。