SpringCloud Alibaba Nacos服务注册和配置中心

571 阅读4分钟

Nacos作为服务注册中心

配置项Key默认值说明
服务端地址spring.cloud.nacos.discovery.server-addrNacos Server 启动监听的ip地址和端口
服务名spring.cloud.nacos.discovery.service${spring.application.name}给当前的服务命名
服务分组spring.cloud.nacos.discovery.groupDEFAULT_GROUP设置服务所处的分组
权重spring.cloud.nacos.discovery.weight1取值范围 1 到 100,数值越大,权重越大
网卡名spring.cloud.nacos.discovery.network-interface当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址
注册的IP地址spring.cloud.nacos.discovery.ip优先级最高
注册的端口spring.cloud.nacos.discovery.port-1默认情况下不用配置,会自动探测
命名空间spring.cloud.nacos.discovery.namespace常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
AccessKeyspring.cloud.nacos.discovery.access-key当要上阿里云时,阿里云上面的一个云账号名
SecretKeyspring.cloud.nacos.discovery.secret-key当要上阿里云时,阿里云上面的一个云账号密码
Metadataspring.cloud.nacos.discovery.metadata使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息
日志文件名spring.cloud.nacos.discovery.log-name
集群spring.cloud.nacos.discovery.cluster-nameDEFAULT配置成Nacos集群名称
接入点spring.cloud.nacos.discovery.enpointUTF-8地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否集成Ribbonribbon.nacos.enabledtrue一般都设置成true即可
是否开启Nacos Watchspring.cloud.nacos.discovery.watch.enabledtrue可以设置成false来关闭 watch

服务提供者

新建Modulecloudalibaba-provider-payment9001

image-20200710205212074

pom

父模块的pom中添加依赖

<!--spring cloud alibaba 2.1.0.RELEASE-->
<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>

本模块中导入spring-cloud-starter-alibaba-nacos-discovery

<dependencies>
    <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>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency><dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version>
</dependency>
 </dependencies>

yml

image-20200710210312321

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #配置Nacos地址

management:
  endpoints:
    web:
      exposure:
        include: '*'

主启动类

创建PaymentMain9001 ,使用@EnableDiscoveryClient开启服务注册与发现

image-20200710210618472

//开启服务注册与发现
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain9001.class,args);
    }
}

controller

创建PaymentController

image-20200710210754207

@RestController
public class PaymentController
{
    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id)
    {
        return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
    }
}
 

测试

启动Nacos Server 9001,访问http://localhost:8848/nacos/查看服务列表

image-20200710211009166

注册成功!

访问http://localhost:9001/payment/nacos/1运行成功

image-20200710211357956

为了展示nacos的负载均衡,参照9001新建9002,只有配置文件端口号不同,主启动类名不同

image-20200710212002160

启动运行,查看是否注册

image-20200710212142016

点击详情查看

image-20200710212208357

注册成功!

访问http://localhost:9002/payment/nacos/1程序运行成功

image-20200710212243996

服务消费者

新建模块cloudalibaba-consumer-nacos-order83

image-20200710212328007

pom

<dependencies>
    <!--SpringCloud ailibaba nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>com.kylin</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </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>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

为什么nacos支持负载均衡?因为nocos-discovery集成了ribbon

image-20200710212638236

yml

service-url.nacos-user-service值为消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者,可以不配置)

image-20200710212910711

server:
  port: 83


spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

主启动类

创建OrderNacosMain83

image-20200710213153253

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

RestTemplate

编写RestTemplate配置类ApplicationContextBean,开启负载均衡

image-20200710214958745

@Configuration
public class ApplicationContextBean {

    @Bean
    //开启负载均衡
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

controller

编写OrderNacosController

image-20200710215059977

@RestController
@Slf4j
public class OrderNacosController {
    @Resource
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serverURL;

    @GetMapping(value = "/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id)
    {
        return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
    }

}

测试

启动9001 9002 83 Nacos Server

image-20200710214002694

访问http://localhost:8848/nacos/查看服务列表

image-20200710214033560

服务注册成功!

访问http://localhost:83/consumer/payment/nacos/13

GIF2151

轮询负载成功!

Nacos作为服务配置中心演示

基础配置

新建cloudalibaba-config-nacos-client3377

pom

image-20200711083132976

<dependencies>
    <!--nacos-config-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <!--nacos-discovery-->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>com.kylin</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>1.0-SNAPSHOT</version>
    </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>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

yml

Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,来取配置之后,才能保证项目的正常启动。

springboot中的配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profile.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

bootstrpa.yml

image-20200711090738405

yaml不能简写为yml,nacos不支持

server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #服务注册中心地址
      config:
        server-addr: localhost:8848 #配置中心地址
        file-extension: yaml #指定yaml格式的配置

#${prefix}-${spring.profile.active}.${file-extension}
# nacos-config-client-dev.yaml

注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension} 如果没有配可能发生一些错误

application.yml

image-20200711085551525

spring:
  profiles:
    active: dev

Nacos Server中添加nacos-config-client-dev.yaml配置文件

image-20200711091110886

image-20200711091041332

config:
    info: from nacos config center,nacos-config-client-dev.yaml,version=1

点击发布

image-20200711091242412

image-20200711091257197

主启动类

创建NacosConfigClientMain3377

image-20200711084436509

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

controller

通过Spring Cloud原生注解@RefreshScope实现配置自动更新

image-20200711084730810

@RestController
//实现配置自动更新
@RefreshScope
public class ConfigClientController
{
    @Value("${config.info}")
    private String configInfo;

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

测试

启动前需要在nacos客户端-配置管理-配置管理栏目下有没有对应的yaml配置文件,运行cloud-config-nacos-client3377的主启动类

image-20200711091350613

访问http://localhost:3377/config/info

image-20200711091436113

修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新。修改version为2

image-20200711091637188

image-20200711091646106

确认发布

image-20200711091706275

再次访问http://localhost:3377/config/info,更新成功!

image-20200711091729320

分类配置

概念。。。

DataID方案

默认空间+默认分组+新建dev和test两个DataID,dev我们已经创建好了,创建nacos-config-client-test.yaml

config:
    info: from nacos config center,nacos-config-client-test.yaml,version=1

image-20200711093230821

image-20200711093250619

通过spring.profile.active属性就能进行多环境下配置文件的读取

image-20200711093443701

此时读取的就是nacos-config-client-test.yaml文件config.info

测试,重新启动3377,访问http://localhost:3377/config/info

image-20200711093652751

Group方案

通过Group实现环境区分,新建GroupDEV_GROUPnacos-config-client-info.yaml

image-20200711094202456

config:
    info: nacos-config-client-info.yaml,DEV_GROUP

image-20200711094221216

同样再次创建nacos-config-client-info.yamlGroup为TEST_GROUP

image-20200711094458382

config:
    info: nacos-config-client-info.yaml,TEST_GROUP

image-20200711094519620

修改配置文件spring.cloud.nacos.config.group配置group,默认为DEFAULT_GROUP

image-20200711095131222

通过配置读取配置中心中的TEST_GROUP分组下的nacos-config-client-info.yaml文件

bootstrap.yml

server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #服务注册中心地址
      config:
        server-addr: localhost:8848 #配置中心地址
        file-extension: yaml #指定yaml格式的配置
        group: TEST_GROUP #指定group 默认值为DEFAULT_GROUP

#${prefix}-${spring.profile.active}.${file-extension}
# nacos-config-client-dev.yaml

applicaiton.yml

spring:
  profiles:
    active: info
#    active: dev
#    active: test

测试,重新启动3377,访问http://localhost:3377/config/info

image-20200711095440350

修改group为DEV_GROUP

image-20200711095504086

测试,重新启动3377,访问http://localhost:3377/config/info

image-20200711095652945

成功!

Namespace方案

新建dev/test的Namespace

image-20200711095857542

image-20200711095936125

image-20200711095957703

image-20200711100009161

分别带有各自的命名空间ID

回到服务管理-服务列表查看

image-20200711100113933

点击dev

image-20200711100340082

新建nacos-config-client-dev.yaml

image-20200711102740854

config:
    info: 1e849be4-14fe-450d-8da9-8bb25413ac5f dev namespace

image-20200711102705882

修改配置文件spring.cloud.nacos.config.namespace配置命名空间ID

image-20200711103124488

测试,重新启动3377,访问http://localhost:3377/config/info

image-20200711102500996

Nacos持久化配置解释

Nacos默认自带的是嵌入式数据库derby,官方源代码中的pom中可以看出引入了

image-20200711140911532

derby到mysql切换配置步骤

nacos-server-1.1.4\nacos\conf目录下找到sql脚本sql语句源文件

image-20200711135726643

image-20200711135820708

创建nacos_config

image-20200711135910831

复制运行sql语句

image-20200711135940372

image-20200711140030660

接着nacos-server-1.1.4\nacos\conf目录下找到application.properties

image-20200711140158637

添加数据库配置

image-20200711140250109

spring.datasource.platform=mysql
 
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=数据库密码

重新启动nacos,可以看到是个全新的空记录界面

image-20200711140438365

image-20200711140552139

Linux安装Nacos

github.com/alibaba/nac…

下载后发送到服务器的/opt 目录,使用tar -zxvf nacos-server-1.1.4.tar.gz 解压

image-20200711143746068

解压成功后得到nacos目录复制到/mynacos使用cp -r nacos /mynacos

image-20200711143923201