简介
Spring Cloud Alibaba为分布式应用程序开发提供了一站式解决方案。它包含开发分布式应用程序所需的所有组件,我们可以基于这套解决方案轻松的创建分布式应用程序。之前学习过服务注册和配置Spring Cloud Eureka和Config,今天来学习的主角是Nacos,那么换了服务注册与配置中心,借机也了解一下相关历史吧。
服务注册管理中心有很多解决方案,包括之前学习的Eureka,今天学习的Nacos,还有类似Zookeeper和Consul等等。Nacos是Alibaba开源的服务注册中心组件,内部孵化最早叫ConfigServer,Nacos是ConfigServer 的开源实现。2008年,阿里巴巴就开始服务化的进程,经过了十余年的积累,2018年7月,阿里巴巴高级技术专家许真恩发布了Nacos首个开源版本V0.1.0,Nacos开源的最新版本为1.2.1,项目地址为:https://github.com/alibaba/nacos/releases
Nacos生态

如上图所示,Nacos比较强调融入其它开源生态,除了对自身体系比如Dubbo等支持外,还包括 Java 的微服务生态体系 Spring Cloud,K8S以及CNCF云原生生态体系等的支持。Nacos 可无缝支持 Spring Cloud,为 Spring Cloud 用户其提供更简便的配置中心和注册中心的解决方案,目前,也算是Spring Cloud的一分子。

Nacos的基本概念
命名空间(Namespace)
不同命名空间可以作为生产和开发环境的隔离。
配置(Configuration)
系统中一些配置信息可以注册到Nacos进行管理;
利用Nacos进行配置的动态发布。
配置管理(Configuration Management)
系统配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动。
配置ID和配置分组(Data ID & Group)
配置ID作为配置的唯一标识;
配置分组内可以有多个配置ID,形成一个配置集。
服务名(Service)
注册服务的唯一标识。
服务注册中心(Service Registry)
存储服务实例和服务负载均衡策略的数据库。
服务发现(Service Discovery)
在计算机网络上,(通常使用服务名)对服务下的实例的地址和元数据进行探测,并以预先定义的接口提供给客户端进行查询。
服务分组(Service Group)
不同的服务可以归类到同一分组。
虚拟集群(Virtual Cluster)
同一个服务下的所有服务实例组成一个默认集群, 集群可以被进一步按需求划分,划分的单位可以是虚拟集群。
实例(Instance)
提供一个或多个服务的具有可访问网络地址(IP:Port)的进程。
权重(Weight)
实例级别的配置。权重为浮点数。权重越大,分配给该实例的流量越大。
健康检查(Health Check)
通过TCP/HTTP的方式检查服务下某实例的健康度,从而确定该实例是否能够提供服务,对于不健康的实例服务端则不会返回。
健康保护阈值(Protect Threshold)
为了防止因过多实例 (Instance) 不健康导致流量全部流向健康实例 (Instance) ,继而造成流量压力把健康 健康实例 (Instance) 压垮并形成雪崩效应,应将健康保护阈值定义为一个 0 到 1 之间的浮点数。当域名健康实例 (Instance) 占总服务实例 (Instance) 的比例小于该值时,无论实例 (Instance) 是否健康,都会将这个实例 (Instance) 返回给客户端。这样做虽然损失了一部分流量,但是保证了集群的剩余健康实例 (Instance) 能正常工作。
部署Nacos Server
在https://github.com/alibaba/nacos/releases中下载打包好的jar文件,这里我下载的是1.2.0版本。当然,你也可以去clone源代码到本地,然后自己build

解压完之后,打开CMD命令行,转到bin目录文件夹下运行命令
startup.cmd -m standalone
端口默认是8848,访问路径/nacos

打开页面测试,如下图,配置成功

Nacos的服务注册
为了方便,我们基于上一节学习Sleuth的代码进行改造,这个工程里,正好有一个服务提供者和一个调用者,整体的套路跟Eureka基本类似,比较简单,首先引入nacos依赖包。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
修改两个工程的配置文件,注册到Nacos
server:
port: 9001
spring:
application:
name: service-provider-a
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
修改启动类,加入@EnableDiscoveryClient

启动两个服务,如下图,去Nacos控制台查看服务注册情况

Nacos作为配置中心
引入配置中心的依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
然后修改两个服务的配置文件,变成bootstrap.yml,然后把配置中心也指向我们Nacos server
server:
port: 9001
spring:
application:
name: service-provider-a
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
然后我们改代码,从配置中心取配置的值
package org.dothwinds.serviceprovider;
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.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@RestController
@EnableDiscoveryClient
public class SpringCloudStudyServiceProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudStudyServiceProviderApplication.class, args);
}
@Autowired
private RestTemplate restTemplate;
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
@Value(value = "${user.name}")
private String name;
@GetMapping("/sayHi")
public String sayHi() {
return "hi," + name + ", welcome to my world ";
}
}
然后在Nacos Server里增加配置值,这里需要说明data-id就是我们的service服务名,然后加上配置文件的文件后缀名来命名,进入Nacos控制台,点击配置管理-》配置列表右侧的加号,新建配置值如下:


建完之后,启动服务测试,如下图:
服务与配置匹配关系
spring:
application:
name: service-provider-a
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
prefix: nacos-provider
profiles:
active: dev
server
port: 9001
如上图的配置,配置了Nacos Config Server的地址,配置的扩展名是ymal(目前仅支持ymal和properties)。主要需要注意的是,上面的配置是和Nacos中的DataId的格式是对应的,完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
- prefix默认值就是spring.application.name的值,如这里指定prefix的值,那么就是prefix的值
- spring.profile.active如果不指定,那么需要把前面的“-”一并去掉
- file-extension是扩展名的值,目前仅支持yaml和properties。但是在Nacos控制台配置的时候,一定要写后缀名,没有特殊指定就是.properties
参考资料:
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html
代码:
比较简单,自己动手写一下吧
1039



被折叠的 条评论
为什么被折叠?



