SpringCloud学习系列〇nacos从入门到出门

nacos可提供动态服务发现、服务配置、服务元数据及流量管理。

nacos集群搭建

  1. 下载nacos:https://github.com/alibaba/nacos/releases/download/1.2.0/nacos-server-1.2.0.zip

  2. 解压

  3. 修改startup.cmd中的MODE为cluster,只要不为standalone就行。

  4. 复制bin/startup.cmd,分别为bin/startup-8858.cmd,bin/startup-8868,这样会得到3份启动脚本,然后在复制出来的脚本中,分别加入所需要绑定的端口,如下:

    // bin/startup-8858.cmd
    set "JAVA_OPT=%JAVA_OPT% -Dserver.port=8858"
    // bin/startup-8868.cmd
    set "JAVA_OPT=%JAVA_OPT% -Dserver.port=8868"
    

    注意位置,放在读取默认配置代码的后面,会导致端口修改不生效。最保险的是放在这个变量最开始地方的前面。可参考下面的修改:

  1. 重命名cluster.conf.example为cluster.conf,然后加入其它实例信息:
192.168.137.1:8848
192.168.137.1:8858
192.168.137.1:8868
  1. 在docker环境中创建一个mysql容器,root密码为root,如下:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:5.7
  1. 登录进MySQL,新增一个nacos数据库,然后运行conf/nacos-mysql.sql,导入nacos需要的表结构:

  1. 修改application.properties中数据库相关的配置

  1. 依次点击startup.cmd、startup-8858.cmd、startup-8868.cmd

  1. 然后随便打开一个实例的url,这里选了8848的实例,如下:

  1. 后面还可以考虑做一个nginx,对三个nacos做一下负载均衡,docker运行指令如下:

    docker run --name nginx -v /d/projects/nginx:/etc/nginx -p 80:80 -d nginx
    

    nginx的配置信息如下:

    user www-data;             ## 配置 worker 进程的用户和组
    worker_processes auto;     ## 配置 worker 进程启动的数量,建议配置为 CPU 核心数
    error_log logs/error.log;  ## 全局错误日志
    pid /run/nginx.pid;        ## 设置记录主进程 ID 的文件
    worker_rlimit_nofile 8192; ## 配置一个工作进程能够接受并发连接的最大数
    
    events {
        
    }
    
    http{
    	upstream nacos {
    		server 192.168.137.1:8848;
    		server 192.168.137.1:8858;
    		server 192.168.137.1:8868;
    	}
    
    	server {
    		listen 80;
    		server_name  localhost;
    		location /nacos/ {
    			proxy_pass http://nacos/nacos/;
    		}
    	}
    }
    

还试了一下,删掉leader,过段时间会重新选举出来新的leader。

如何在代码中使用nacos

还是继续分成两种类型,一种是配置相关,另一种是服务注册与发现。

配置信息

可通过web端访问localhost/nacos来进行管理,也可以通过命令行进行简单的查询、管理:

// 发布配置
curl -X POST "http://localhost/nacos/v1/cs/configs?dataId=module-01.yml&group=DEFAULT_GROUP&content=hellonacos"
// 获取配置
curl -X GET "http://localhost/nacos/v1/cs/configs?dataId=module-01.yml&group=DEFAULT_GROUP"

在代码中使用nacos的配置使用时,以Spring Cloud为例(也可参考官方文档demo):

①pom文件需要特别注意版本问题,用官方的实例都有问题,主要体现在配置发布了之后不能刷新

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-config -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>2.2.0.RELEASE</version>
    </dependency>
</dependencies>

出问题的原因主要是版本不一致。主要是看Spring Boot的版本,这里的Spring Boot版本是v2.2.5.RELEASE,根据官网版本说明wiki可以看出:

所以这里选2.2.0.RELEASE版本的spring-cloud-starter-alibaba-nacos-config。按照官网example的例子,选0.2.1.RELEASE配置更新后,并不会刷新。

resources下面新建bootstrap.yaml,并在nacos上面创建好module-01.yaml

spring:
  application:
    name: module-01
  cloud:
    nacos:
      config:
        refresh:
          enabled: true
        server-addr: localhost
        file-extension: yaml

module-01.yaml的内容如下:

③创建启动类。与普通Spring Boot应用无区别。

package com.example.springloud.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

④创建获取配置信息的接口。需要加上@RefreshScope,以使自动刷新生效。

package com.example.springloud.demo.controller;

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

@RestController
@RequestMapping("config")
@RefreshScope
public class GetDynamicValueController {
    @Value(value = "${hello}")
    private String dynamicValueStr;

    @RequestMapping("get")
    public String getStr() {
        return dynamicValueStr;
    }
}

⑤修改配置,看能否自动刷新。如果加了@RefreshScope注解,但还是不能自动刷新,可考虑检查Spring Boot与spring-cloud-starter-alibaba-nacos-config版本是否一致。

服务注册与发现

在开始之前,还是要注意一下版本问题。

①pom文件导入spring-cloud-starter-alibaba-nacos-discovery。版本选的2.2.0.RELEASE,原因同上所述。如果不能运行了,那么再参看官网wiki上面的版本对应表进行修改。

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

②bootstrap.yaml文件中加入服务发现相关的配置:

spring:
  application:
    name: module-01
  cloud:
    nacos:
      discovery:
        server-addr: localhost
      config:
        server-addr: localhost
        file-extension: yaml

③创建RestTemplate实例,然后加上@LoadBalanced注解,开启 @LoadBalancedRibbon 的集成。

package com.example.springloud.demo.beans;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class LoadBalancedTemplate {
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

④在Controller中注入restTemplate,然后新建一个新的接口config/remote-get,通过nacos,调用注册在其上的config/get接口,作为返回。

package com.example.springloud.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("config")
@RefreshScope
public class GetDynamicValueController {
    @Value(value = "${hello}")
    private String dynamicValueStr;

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("get")
    public String getStr() {
        return dynamicValueStr;
    }

    @RequestMapping("remote-get")
    public String getStrViaNacos() {
        return restTemplate.postForObject("http://module-01/config/get", null, String.class);
    }
}

此时的demo整体架构为:

⑤运行代码,可以观察到nacos上面的服务列表中出现了module-01:

调用config/remote-get接口,正常返回config/get接口的数据:

发布了166 篇原创文章 · 获赞 118 · 访问量 26万+

猜你喜欢

转载自blog.csdn.net/asahinokawa/article/details/104831403