Nacos注册中心、配置中心介绍+SpringCloud代码示例

本文将介绍Nacos作为注册中心和配置中心是如何使用的。首先简单了解下Nacos架构:

Nacos注册中心、配置中心介绍+SpringCloud代码示例_第1张图片

服务 (Service)

服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service。

服务注册中心 (Service Registry)

服务注册中心,它是服务,其实例及元数据的数据库。服务实例在启动时注册到服务注册表,并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。

从上述定义可以知道,服务/一组服务在启动时会将自身注册到服务注册中心的服务注册表当中,当其它服务请求另一个服务时会先查找服务注册表找到对应可用实例,再发起对可用实例的服务调用。

不多展开,本文以一个SpringCloud服务端工程+一个SpringCloud客户端工程,同时启动2个服务端实例,客户端采用RestTemplate负载均衡调用服务端的方式演示效果。关于Nacos的集群简易环境搭建见文末链接。

(1)整体工程结构:

Nacos注册中心、配置中心介绍+SpringCloud代码示例_第2张图片

springcloud-nacos:父pom工程,主要定义公用的maven依赖,如springboot,springcloud,springcloud-alibaba等。

nacos-spring-cloud-provider:服务端工程,提供服务。

nacos-spring-cloud-comsumer:客户端工程,接收浏览器请求获取服务端服务,响应服务端数据。

(1)springcloud-nacos:父pom工程的maven文件pom.xml定义:



  4.0.0
  com.alibaba.example
  nacos-spring-cloud-example
  pom
  0.2.0-SNAPSHOT

  
    
    
      org.springframework
      spring-webmvc
      5.0.8.RELEASE
    
    
    
      org.springframework
      spring-core
      5.0.8.RELEASE
    
    
    
      javax.servlet
      javax.servlet-api
      3.0.1
      provided
    
    
      org.apache.tomcat.maven
      tomcat7-maven-plugin
      2.2
      provided
    
    
      com.alibaba
      fastjson
      1.2.31
    
    
      com.fasterxml.jackson.core
      jackson-databind
      2.9.1
    
  

  
  
    
      
      
        org.apache.maven.plugins
        maven-compiler-plugin
        3.5.1
        
          1.7
          1.7
          UTF-8
        
      
      
      
        org.apache.tomcat.maven
        tomcat7-maven-plugin
        2.2
        
          /
          9090
          UTF-8
          tomcat7
          
          true
        
      
    
  

(2)nacos-spring-cloud-provider工程:

Nacos注册中心、配置中心介绍+SpringCloud代码示例_第3张图片

pom.xml:

引入spring-boot-starter-web和spring-cloud-starter-alibaba-nacos-discovery

nacos-client,注意还要额外引入hibernate-validator用于替换springbootweb内部的高版本兼容包。

核心依赖为spring-cloud-starter-alibaba-nacos-discovery



    
        nacos-spring-cloud-example
        com.alibaba.example
        0.2.0-SNAPSHOT
    

    4.0.0
    nacos-spring-cloud-provider
    
        
            org.springframework.boot
            spring-boot-starter-web
            
                
                    org.hibernate
                    hibernate-validator
                
            
        
        
            org.springframework.cloud
            spring-cloud-starter-alibaba-nacos-discovery
            
                
                    com.alibaba.nacos
                    nacos-client
                
            
        
        
            com.alibaba.nacos
            nacos-client
        
        
            org.hibernate
            hibernate-validator
            5.1.0.Final
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    
                        
                            repackage
                        
                    
                
            
            
                maven-compiler-plugin
                
                    1.8
                    1.8
                
            
        
    


application.properties:

主要声明注册中心的集群地址spring.cloud.nacos.discovery.server-addr。

注意在集群模式下这里一定要配置多个,否则启动会报错。

server.port=8070
spring.application.name=service-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:3333,127.0.0.1:4444,127.0.0.1:5555

NacosProviderApplication:

主要定义要提供的服务方法,同时开启服务注册。核心是添加@EnableDiscoveryClient注解

package com.alibaba.nacos.example.spring.cloud;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 */
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {

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

	@Value("${server.port}")
	private int port;

	@RestController
	class EchoController {
		@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
		public String echo(@PathVariable String string) {
			return "Hello Nacos Discovery " + string + ",port:"+port;
		}
	}
}

以上就创建好了SpringCloud的服务端,在IDEAJ设置Edit Configuration,勾上Allow parallel run,启动一个服务端实例后,修改applicaiton.properties配置文件的port端口由8070改为8071继续启动该服务,这样就同时启动了2个服务端的服务,端口分别为8070和8071。

Nacos注册中心、配置中心介绍+SpringCloud代码示例_第4张图片

启动后,可以在Nacos看到两个服务:

Nacos注册中心、配置中心介绍+SpringCloud代码示例_第5张图片

(3)nacos-spring-cloud-consumer工程:客户端工程既完成向Nacos注册中心的注册,也实现了获取Nacos配置中心的功能。代码如下:

pom.xml:



    
        nacos-spring-cloud-example
        com.alibaba.example
        0.2.0-SNAPSHOT
    
    4.0.0
    nacos-spring-cloud-comsumer

    
        2.0.0.RELEASE
        2.0.0.RELEASE
    

    
        
            org.springframework.boot
            spring-boot-starter-web
            
                
                    org.hibernate
                    hibernate-validator
                
            
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-ribbon
            ${spring-cloud-netflix.version}
        
        
            org.springframework.cloud
            spring-cloud-starter-openfeign
            ${spring-cloud-openfeign.version}
        
        
            org.springframework.cloud
            spring-cloud-starter-alibaba-nacos-discovery
            
                
                    com.alibaba.nacos
                    nacos-client
                
            
        
        
            com.alibaba.nacos
            nacos-client
        
        
            org.springframework.cloud
            spring-cloud-starter-alibaba-nacos-config
            0.2.1.RELEASE
        
        
            org.hibernate
            hibernate-validator
            5.1.0.Final
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    
                        
                            repackage
                        
                    
                
            
            
                maven-compiler-plugin
                
                    1.8
                    1.8
                
            
        
    

application.properties:

server.port=8084
spring.cloud.nacos.discovery.server-addr=127.0.0.1:3333,127.0.0.1:4444,127.0.0.1:5555

bootstrap.yml:

spring:
  application:
    name: consumer
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:3333,127.0.0.1:4444,127.0.0.1:5555
        bootstrap:
          enable: true
          log:
            enable: true
        namespace: aad916e5-78d3-40a6-9bd6-e2cfa69edbd3
        group: PROD_GROUP
        file-extension: yaml
        ext-config[0]:
          data-id: consumer-dev.yaml
          refresh: true

NacosComsumerApplication:

package com.alibaba.nacos.example.spring.cloud;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 */
@SpringBootApplication(scanBasePackages={"com.alibaba.nacos"})
@EnableDiscoveryClient
public class NacosConsumerApplication {

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

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConsumerApplication.class, args);
        String useLocal = applicationContext.getEnvironment().getProperty("com.useLocal");
        System.err.println("useLocal:"+useLocal);
    }

}

TestController:

package com.alibaba.nacos.example.spring.cloud.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.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
@RefreshScope //实现配置自动更新
public class TestController {

    @Resource
    private RestTemplate restTemplate;

    @Value("${com.useLocal}")
    private String useLocalCache;

    @Autowired
    public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}

    @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
    public String echo(@PathVariable String str) {
        return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
    }

    @RequestMapping("/get")
    public String get() {
        return useLocalCache;
    }
}

注意:客户端向Nacos注册服务,和服务端一样只需要执行nacos.discovery.server-addr,加上@EnableDiscoveryClient即可。

在客户端请求服务端的方法中,使用restTemplate负载均衡方式调用http://service-provider/echo/服务。

客户端启动后,在Nacos控制台服务列表可以看到注册后的客户端实例。

通过浏览器多次访问http://localhost:8084/echo/hello,可以看到客户端通过负载均衡方式请求到不同端口的服务端上:

Nacos注册中心、配置中心介绍+SpringCloud代码示例_第6张图片

Nacos注册中心、配置中心介绍+SpringCloud代码示例_第7张图片

Nacos配置中心

我们知道工程的配置文件一般放在bootstrap.properties或application.properties文件中,我们想要修改某个配置时时常需要修改配置文件,然后还需要重新打包工程并发布,过程非常繁琐,对于微服务工程很多的时候这种运维工作更是难受。

那么Nacos配置中心就能很好满足动态配置获取的多工程配置隔离的需求了。客户端从配置中心获取动态配置,则需要在bootstrap启动文件中声明nacos.config.server-addr配置中心地址,以及命名空间namespace、组group、文件后缀file-extension等属性。

本例中见bootstrap.yml文件的配置,配置好后再Nacos客户端的配置管理新增在线配置文件。注意文件的命名有指定规范,规范见官网说明。我们根据指定的命名规范创建一个配置文件,配置内容填入样例com.useLocal: 1234560000,发布即可: 

Nacos注册中心、配置中心介绍+SpringCloud代码示例_第8张图片

Nacos注册中心、配置中心介绍+SpringCloud代码示例_第9张图片

上面的配置好后,客户端工程启动,就可以自动获取到com.useLocal: 1234560000配置并加载到环境中了。

Nacos注册中心、配置中心介绍+SpringCloud代码示例_第10张图片

接下来怎么体现这个自动更新配置呢,我们在TestController上要加上注解@RefreshScope //实现配置自动更新。然后在Nacos控制台重新编辑这个配置,修改刚才的样例配置内容为com.useLocal: 123。重新发布:

Nacos注册中心、配置中心介绍+SpringCloud代码示例_第11张图片

这样就自动更新了配置,我们在浏览器再次访问http://localhost:8084/get就能看到浏览器输出最新的配置了。

本文样例代码地址:

springcloud-nacos-Java文档类资源-CSDN下载

Nacos Win7集群环境搭建:

Nacos注册中心/配置中心 WIN7集群配置介绍_喜欢火影的木易杨的博客-CSDN博客_nacos配置中心集群

你可能感兴趣的:(SpringCloud,spring,cloud,java,eureka)