四大功能
-
服务发现与服务健康监测
-
支持基于 DNS 和 RPC 的服务发现;
-
对服务提供实时的健康监察,阻止向不健康的主机或者服务实例发送请求;
-
-
配置中心与动态配置服务
-
解决了配置变更时需要重新部署应用和服务的问题,是配置管理更加高效简洁;
-
提供了控制台帮助管理所有应用的配置;
-
提供了版本跟踪、配置回滚等功能;
-
-
动态 DNS 服务
- 动态 DNS 服务支持权重路由,更容易实现中间层负载均衡、灵活的路由策略、流量控制以及简单的 DNS 解析服务;
-
服务以及元数据管理
- 从微服务平台建设的视角管理数据中心的所有服务以及元数据;
基本使用
Nacos 作为注册中心
SpringCloud父项目构建
新建 maven 项目 SpringCloudAlibabaDemo,删除 src 等不需要的文件,pom 文件依赖引用内容如下
<!-- 统一管理jar包版本 -->
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>4.12</junit.version>
<lombok.version>1.18.16</lombok.version>
</properties>
<!-- 子模块继承之后,提供作用:
锁定版本+子modlue不用写groupId和version -->
<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.RELEASE-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--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>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>
支付服务模块构建
在父项目下新建 maven 项目 payment8001,pom 文件引入下列依赖
<dependencies>
<!-- SpringCloud alibaba nacos 服务发现 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot整合web组件 -->
<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>
<!-- 常规jar -->
<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>dependency>
</dependencies>
编写配置文件 application.yml,配置 nacos 服务地址及端口
server:
port: 8001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
#配置 Nacos 地址
server-addr: <nacos-server-ip>:8848
#打开全部监控端点
management:
endpoints:
web:
exposure:
include: '*'
创建启动类
@SpringBootApplication
public class PaymentStart8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentStart8001.class);
}
}
编写支付模块控制类
@RestController
@RequestMapping("/nacos")
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "nacos registry,serverPort:" + serverPort + "\t id" + id;
}
}
一个支付模块项目构建完成,按上述步骤再构建一个 payment8002 用于测试,项目端口更改为 8002 端口
订单服务模块构建
在父项目下新建 maven 项目 order8005,pom 文件引入下列依赖
<dependencies>
<!-- SpringCloud alibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot整合web组件 -->
<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>
<!-- 常规jar -->
<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>
编写配置文件 application.yml,配置 nacos 服务地址及端口
server:
port: 8005
spring:
cloud:
nacos:
discovery:
server-addr: <nacos-server-ip>:8848
application:
name: nacos-order-consumer
#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
server-url:
nacos-user-service: http://nacos-payment-provider
新建启动类
@SpringBootApplication
public class OrderStart8005 {
public static void main(String[] args) {
SpringApplication.run(OrderStart8005.class);
}
}
新建配置类,赋予RestTemplate负载均衡的能力,通过 Ribbon 实现
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced // 赋予RestTemplate负载均衡的能力
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
编写订单模块控制类
@RestController
@RequestMapping("/nacos")
public class OrderController {
@Resource
private RestTemplate restTemplate;
@Value("${server-url.nacos-user-service}")
private String serverURL;
@GetMapping("/order/{id}")
public String paymentInfo(@PathVariable("id") Integer id){
return restTemplate.getForObject(serverURL + "/nacos/payment/" + id, String.class);
}
}
功能测试
启动order8005、payment8001以及payment8002,登录 nacos 页面查看服务
三个服务已经注册完毕,使用 postman 访问订单模块,实现订单模块对支付模块的调用,连续进行请求,可以看到目前采用轮询的负载均衡方式
若要采用其他的负载均衡方式,可以在订单模块的配置文件中进行修改
#设置Ribbon进行客户端负载均衡的策略
nacos-payment-provider: #服务提供者名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #策略:随机
Ribbon 轮询策略:
- RoundRobinRule:轮询(默认)
- RandomRule:随机
- RetryRule:先按照 RoundRobinRule 的策略获取服务,若获取失败则在指定时间内重复
- WeightedResponseTimeRule:对 RoundRobinRule 的扩展,响应速度越大的实例选择权重越大,越容易被选择
- BestAvailableRule:会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
- AvailabilityFilteringRule:先过滤掉故障实例,再选择并发较小的实例
- ZoneAvoidanceRule:默认规则,复合判断 server 所在区域的性能和可用性选择服务器
Nccos 作为配置中心
测试服务构建
在父项目中创建子项目 nacosClient9000,pom 文件中引入下列依赖
<dependencies>
<!-- SpringCloud alibaba nacos-config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud alibaba nacos discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot整合web组件 -->
<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>
<!-- 常规jar -->
<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 在初始化时,要保证先从配置中心进行配置的拉取,随后才能保证项目的正常启动
bootstrap.yml:
server:
port: 9000
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: <nacos-server-ip>:8848 #nacos服务注册中心地址
config:
server-addr: <nacos-server-ip>:8848 #nacos作为配置中心地址
file-extension: yml #指定yml格式的配置
application.yml:
spring:
profiles:
active: dev
创建启动类
@SpringBootApplication
public class NacosClientStart9000 {
public static void main(String[] args) {
SpringApplication.run(NacosClientStart9000.class);
}
}
编写控制类
@RefreshScope // 支持 naocs 动态配置刷新
@RestController
@RequestMapping("/nacos")
public class NacosClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/configInfo")
public String getConfigInfo() {
return configInfo;
}
}
配置文件创建
在 nacos 中创建新的配置文件,如图
编写配置文件的内容,注意 DataID 要与配置文件中的相应配置匹配,其命名规则为:
${spring.application.name}-${spring.profile.active}-${spring.cloud.nacos.config.file-extension}
功能测试
运行项目,访问相应的接口,可以访问到相应的配置内容
配置文件的寻址
nacos 主要通过命名空间(namespace)、组(group)以及 Data ID 进行配置文件的查找定位,可以通过修改配置文件中的相应属性改变定位,定位次序如下:
-
查找命名空间进行定位
-
查找组进行定位
-
根据 Data ID 进行定位
在 nacos 中创建新的命名空间,新建配置并创建新的组
修改配置文件,配置新的命名空间和组,也可以配置 spring.cloud.nacos.discovery.namespace
将服务注册到新的命名空间
server:
port: 9000
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: <nacos-server-ip>:8848 #nacos服务注册中心地址
config:
server-addr: <nacos-server-ip>:8848 #nacos作为配置中心地址
file-extension: yml #指定yml格式的配置
group: TEST_GROUP # 分组,若不指定则默认为DEFAULT_GROUP
namespace: 3c0dd568-f5a1-437a-a8c7-1a17125e8e65 # 命名空间,若不指定则默认为public
启动项目,调用接口,查询结果