目录
一、springcloud alibaba概述
二、Nacos概述
1、什么是Nacos
2、Nacos能做什么
3、官网
4、各种服务注册中心比较
三、Nacos的安装和运行
1、 下载Nacos
2、下载安装包后解压,打开bin文件,直接在cmd中运行startup.cmd
3、访问可视化界面
四、Nacos作为服务注册中心
1、搭建基于Nacos的服务提供者
(1)新建模块
(2)修改pom文件
(3)编写yml文件
(4)主启动类
(5)业务逻辑代码
(6)运行测试
(7)再按照相同的内容建9002模块
2、基于Nacos的服务消费者
(1)新建模块
(2)修改pom文件
(3)编写yml文件
(4)编写主启动类
(5)编写业务逻辑代码
(6)运行测试
3、各种注册中心对比
(1)Nacos与其他注册中心对比
(2)何时选择使用何种模式
(3) Nacos 支持AP和CP模式的切换
一、springcloud alibaba概述
官方手册:
https://spring.io/projects/spring-cloud-alibaba#overview
通过这张图也能看出cloud alibaba兴起是必然了吧。
二、Nacos概述
1、什么是Nacos
前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。
Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
一句话来描述:Nacos就是注册中心 + 配置中心的组合
Nacos ≈ Eureka+Config +Bus
2、Nacos能做什么
(1)替代Eureka做服务注册中心
(2)替代Config做服务配置中心
3、官网
https://github.com/alibaba/Nacos
文档: https://nacos.io/zh-cn/index.html
Spring Cloud Alibaba Reference Documentation
4、各种服务注册中心比较
三、Nacos的安装和运行
1、 下载Nacos
https://github.com/alibaba/nacos/releases
2、下载安装包后解压,打开bin文件,直接在cmd中运行startup.cmd
3、访问可视化界面
命令运行成功后直接访问 http://localhost:8848/nacos
四、Nacos作为服务注册中心
参考文档: Spring Cloud Alibaba Reference Documentation
1、搭建基于Nacos的服务提供者
(1)新建模块
新建普通maven模块 cloudalibaba-provider-payment9001
9001建好之后再建一个一模一样的9002,方便后面做负载均衡的测试。
(2)修改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>
子模块中:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud</artifactId>
<groupId>com.shang.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-provider-payment9001</artifactId>
<dependencies>
<!--SpringCloud ailibaba 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.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>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
(3)编写yml文件
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
management:
endpoints:
web:
exposure:
include: '*'
(4)主启动类
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class, args);
}
}
(5)业务逻辑代码
@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;
}
}
(6)运行测试
启动9001服务
(7)再按照相同的内容建9002模块
为测试消费者的负载均衡做准备。
2、基于Nacos的服务消费者
Nacos里整合了Ribbon,所以天生能够实现负载均衡。
(1)新建模块
创建普通maven模块 cloudalibaba-consumer-nacos-order83
(2)修改pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud</artifactId>
<groupId>com.shang.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-consumer-nacos-order83</artifactId>
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>com.shang.cloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</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.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>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
(3)编写yml文件
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
(4)编写主启动类
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class,args);
}
}
(5)编写业务逻辑代码
config:
@Configuration
public class ApplicationContextBean
{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
controller:
@RestController
@Slf4j
public class OrderNacosController {
@Autowired
private RestTemplate restTemplate;
//路径写在配置文件里
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id)
{
return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}
}
(6)运行测试
访问 http://localhost:83/consumer/payment/nacos/13
实现了9001和9002的轮询。
3、各种注册中心对比
(1)Nacos与其他注册中心对比
C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。
(2)何时选择使用何种模式
一般来说,
如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring cloud 和 Dubbo 服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须,K8S服务和DNS服务则适用于CP模式。
CP模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
(3) Nacos 支持AP和CP模式的切换
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'