0
点赞
收藏
分享

微信扫一扫

使用Nacos作为注册中心和配置中心

关于Nacos

为什么叫Nacos

Nacos能做什么

Nacos核心提供两个功能:服务注册与发现,动态配置管理。

  • 服务注册与发现

    ​ Nacos提供基于DNS和基于RPC的服务发现,即能被用来支持https/http的服务注册与发现,也支持RPC如dubbo的服务注册与发现。

    ​ 与Dubbo使用的zookeeper相比而言,两者差异还是比较大的,zookeeper是一种分布式的协调服务,它天生是作为分布式数据一致性场景下的解决方案,所以zookeeper是CP的,它牺牲了可用性来保证一致性,在极端情况下(master选举期间)服务会对外停止,对于服务可用性要求比较高的系统是难以接受的。Nacos是一种去中心化的架构,属于CAP理论里的AP架构,支持最终一致性,在分布式服务发现与注册场景下具有很不错的性能。目前dubbo官方也支持使用Nacos代替zookeeper。

  • 动态配置服务

    与SpringCloud config 和 SpringCloud Bus类似,Nacos的动态配置服务更加灵活与简便,不需要重启服务可以做到配置实时生效,非常适合“配置优先”的服务开发。

Nacos 生态

Nacos 无缝支持一些主流的开源生态,如下图:

使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易,它能很方便的和SpringCloud、K8S、Dubbo、gRPC、lstio一起使用。

安装Nacos

官方地址

安装方法

前提环境

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

  1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  2. 64 bit JDK 1.8+;下载 & 配置
  3. Maven 3.2.x+;下载 & 配置

方式一 源码安装

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin

方式二 发行包安装

官方仓库提供了发行包下载,可以从 版本库中下载nacos-server-$version.zip /nacos-server-$version.tar.gz 包,解压后,在包目录下的bin文件夹中有可执行脚本运行即可。

方式三 Docker安装

除了以上两种方式安装docker以外,还可以使用docker的方式安装

docker run -tid  --env MODE=standalone --name nacos -p 8848:8848 nacos/nacos-server

安装完成之后,访问http://localhost:8848/nacos/index.html即可打开nacos的web管理界面

Nacos作为注册中心

根项目配置

    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--     SpringCloud Alibaba       -->
            <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> 
        </dependencies>
    </dependencyManagement>

服务生产者

依赖

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

配置文件

server:
  port: 9001

spring:
  application:
    name: nacos-provide-userinfo
  cloud:
    # nacos 配置
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # 配置nacos地址
#暴露端点
management:
  endpoints:
    web:
      exposure:
        include: '*'

测试接口

@RestController
public class EchoController {

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


    @GetMapping("/echo")
    public String echo(){
        return "Hello serverPort : "+serverPort+" uuid :"+ UUID.randomUUID().toString();
    }

}

启动类

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

我们已经可以看到服务已经注册成功了。我们以上面这个服务为模板,再建立一个端口为9002的服务

服务消费者

依赖

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

配置文件

server:
  port: 9091

spring:
  application:
    name: nacos-consume-useradmin
  cloud:
    # nacos 配置
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

RestTemplate注入

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced  // 没有加这个的话没有办法使用服务名来调用接口
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

}

测试接口

@RestController
@RequestMapping("/consume")
public class UserAdminController {
    @Resource
    RestTemplate restTemplate;

    String URL_PREFIX = "http://nacos-provide-userinfo";

    @GetMapping("/echo")
    public String getUser(){
        return restTemplate.getForObject(URL_PREFIX+"/echo", String.class);
    }

}

启动类

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

作为配置中心

依赖

<!-- nacos config-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--   nacos server     -->
<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>

配置文件

  • Bootstrap.yml

    server:
      port: 99
    
    spring:
      application:
        name: nacos-config-client # 这个名称涉及到远程配置文件的名称
      cloud:
        # nacos 配置
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848 #注册中心地址
          config:
            server-addr: 127.0.0.1:8848 # nacos 作为配置中心地址
            file-extension: yaml # 指定配置文件的格式
    
  • Application.yml

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

测试接口

@RestController
@RefreshScope
public class ConfigClientController {

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

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

启动类

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

管理平台配置

新建配置文件

打开Nacos管理界面,选择 配置管理-->配置列表,点击列表右上角的 的图标

nacos规定了Data ID的设定规则,让服务能更加方便的去寻找自己的配置,默认的Data ID的规则是:

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

上面我们配置的应用名称是nacos-config-client,环境配置的是dev,文件格式是 yaml,所以Data ID是nacos-config-client-dev.yaml,注意是yaml,而不是yml

添加完成之后我们可以看到配置文件已经创建成功了。

配置完成后,我们启动服务,服务如果启动成功说明配置正确了,测试下:

➜  ~ curl http://localhost:99/getConfigInfo
Here is dev,version=1.0%                                                                                                                                                 ➜  ~ 

修改配置

我们测试下更新配置文件是否会马上生效,所以我们修改配置文件

配置文件可以查看 历史版本 ,每次修改也会给出对比图。

不要重启nacos-config-client 服务,再次测试接口

➜  ~ curl http://localhost:99/getConfigInfo
Here is dev,version=2.0%                                                                                                                                                 ➜  ~                                                                                        

我们发现更新配置无需手动动态刷新配置,相比较起springcloud config 和 bus的配合动态刷新来说,nacos更加的灵活、方便。

数据隔离

Nacos作为配置中心的时候,我们看到了可以感觉服务的环境来选择不同的配置文件,在Nacos的设计中,我们也可以通过Namespace、Group来做数据的隔离,这里不做赘述,总之,在微服务这些框架里面,Nacos绝对是非常好用的。

举报

相关推荐

0 条评论