八、SpringCloud Alibaba Nacos

CY 2019年03月22日 79次浏览

Spring CloudG版本开始Netflix的很多东西就进入了维护模式,也就是不再开发新的组件了。

SpringCloud Alibaba可以替代之前Netflix公司的很多技术,而且他都有一套非常好用的Web管理界面,使用起来会更加的方便了。

官方的Readme将主要功能介绍的很详细,官方的文档也很简洁。

Spring Cloud Alibaba

使用之前应该去官网看应该导入什么包,下面代码都是取自官网,并加上自己的更改

<dependencies>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2.2.0.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
</dependencies>

Nacos做服务注册

其实功能就类似于Eureka + Config + Bus的组合,点击查看官方手册

安装

到官方GithubRelease中去下载发布包,大概50来兆,如果下载太慢,使用Aria2c就好了

解压完成后直接使用bin目录中的startup启动就可以了

默认端口8848,默认是不需要登录的,可以通过配置文件使其需要登录

将Provider注册到Nacos

不做过多解释了,官方Provider

<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>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
server:
  port: 8001
spring:
  application:
    name: nacos-service-provider
  cloud:
    nacos:
      server-addr: localhost:8848
management:
  endpoints:
    web:
      exposure:
        include: "*"
@RestController
public class EchoController {

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

    @GetMapping(value = "/echo/{string}")
    public String echo(@PathVariable String string) {
        return port + ": Hello Nacos Discovery " + string;
    }
}
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderDemoApplication {

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

启动后,可以看到Nacos中注册了一个服务,就可以了。

image.png

将Consumer注册到Nacos

这个代码就不在这里粘贴了,和上面的配置基本上一样,因为Nacos包里面集成了Ribbon,所以Nacos天生就是有负载均衡的,可以使用@LoadBalanced注解来启用这个功能。

可以启动两个Provider和一个Consumer来测试这个默认的负载均衡。

再谈注册中心的对比

注册中心名称CAP模型控制台管理社区活跃度
EurekaAP支持
ZookeeperCP不支持
ConsulCP支持
NacosAP/CP可切换支持

Nacos做服务配置中心

不同于Spring Cloud Config,配置直接存储在Nacos中。

基础配置使用方法

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

以下配置文件是bootstrap.yaml

spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: yaml

application.yaml

spring:
  profiles:
    active: dev
@RefreshScope
@RestController
public class ConfigController {

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

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

@RefreshScope注解也是SpringCloudConfig中的注解,作用都是动态刷新配置。

接下来需要在Nacos界面中编辑配置文件就好了,需要填写DataId,格式如下:

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

说明在这里

image.png

然后启动项目就可以发现配置生效了,通过Nacos Config功能,不像Spring Cloud Config那样刷新配置那么麻烦,改了配置文件就会自动刷新。

分类配置使用方法

范围:namespace > group > dataid

namespace默认为public

group默认为DEFAULT

cluster默认为DEFAULT

作用是区分部署环境,给微服务分组,给微服务分地域,主要是为了异地微服务调用提供方便的,通过范围的划分可以让微服务找到最近的微服务进行调用。

DataId的配置

上面已经用过了其实,因为DataId中需要spring.profiles.active配置,所以只要更改这个配置,就可以切换多环境下的配置了。

Group的配置

在原来的基础上添加group就行

spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: yaml
        group: TEST_GROUP

namespace配置

新建一个namespace的时候会默认分配一个id,也可以手动填写id,只要将这个id配置到配置文件中即可

spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        file-extension: yaml
        group: TEST_GROUP
        namespace: 10c59270-985c-45f0-987d-0ff39cc18eb3

Nacos持久化配置

Nacos自带了Derby数据库是一个嵌入式数据库,为了搭建集群让好几个Nacos都统一数据,所以需要使用MySQLNacos也只支持MySQL

conf目录下面有一个叫做nacos-mysql.sql的文件,这就是他出厂默认的MySQL脚本,可以运行这个脚本来创建几张表,库名叫做nacos_config

创建表完成后还是在conf目录下,找到application.properties根据注释修改数据库为MySQL,当前不支持MySQL8+

参考文档

Nacos集群配置

Nacos是支持集群配置的,使用Nginx负载到每个集群的节点,Nacos的每个节点都用同一个数据库,就可以实现Nacos的集群了。

为了珍惜生命,我用了Docker来做的集群,官方有详细的解释,网上文档也特别多,就不记录了。