系列文章目录
微服务新王SpringCloudAlibaba
文章目录
系列文章目录前言一、Nacos是什么?能干啥?二、Nacos下载及安装1. 下载2. 安装并运行3. 对比Eureka 三、Nacos作为服务注册中心的演示1. 先构建好基础工程(一篇一篇看过来的不用重新构建)话不多说,立马开干2. 创建基于Nacos的服务提供者3. 启动测试4. 创建一个9002模块(方便后面负载均衡测试)5. 创建基于Nacos的服务调用者模块6. 编写服务调用业务类7. 启动测试调用 四、Nacos作为服务注册中心的对比1. Eureka、Zookeeper、Consul的对比之前SpringCloud注册中心几篇提到的CAP介绍 2. Nacos:我都要 总结前言
如果说有一个SpringCloudAlibaba有一个组件能够封神的话,那么毫无悬念,他就是Nacos!前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。服务的命名,配置管理。Nacos是SpringCloudAlibaba的核心组件。一、Nacos是什么?能干啥?
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos: Dynamic Naming and Configuration ServiceNacos就是注册中心 + 配置中心的组合。Nacos = Eureka+Config +Bus。替代Eureka做服务注册中心。替代Config做服务配置中心。据说 Nacos 在阿里巴巴内部有超过 10 万的实例运行,已经过了类似双十一等各种大型流量的考验。二、Nacos下载及安装
首先本地要有Java8+Maven环境。
1. 下载
进入Nacos官网
https://nacos.io/zh-cn/index.html
点击windows下的zip包,进行下载。
2. 安装并运行
解压安装包,使用CMD小黑窗口直接运行bin目录下的startup.cmd
启动成功之后访问页面查看Nacos,端口号是8848,默认账号密码都是nacos
http://localhost:8848/nacos
3. 对比Eureka
首先,Nacos和Ehreka做注册中心功能点是类似的,也都提供有web页面。其次,Eureka做注册中心需要我们自己搭建模块,而Nacos则直接封装好的,因此选择Nacos会更方便一点。Nacos是中文的,多数数据都是表格的方式呈现的,对我们来说更加友好。三、Nacos作为服务注册中心的演示
我们测试下Nacos作为服务注册中心,然后我们将服务注册进Nacos。
官方文档(我们的配置都是根据官方文档来的):
https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_config
1. 先构建好基础工程(一篇一篇看过来的不用重新构建)
构建基础父工程
Rest风格微服务
传统分布式方法
改造工程,抽取公共模块
想偷懒的请下载;gitee上我上传的代码
基础工程构建完成的目录结构:
启动所有模块,访问
localhost:7001
显示如下,代表基础工程没问题
话不多说,立马开干
2. 创建基于Nacos的服务提供者
模块名
cloudalibaba-provider-payment9001
在父工程的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>
新建的9001模块的pom,主要是spring-cloud-starter-alibaba-nacos-discovery
<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>
application.yml
server:port: 9001spring:application:name: nacos-payment-provider # 注册进注册中心的服务名cloud:nacos:discovery:server-addr: localhost:8848 #配置Nacos地址management:endpoints:web:exposure:include: '*'
主启动类
com.atguigu.springcloud.PaymentMain9001
package com.atguigu.springcloud;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** @Author: Daisen.Z* @Date: /1/13 14:31* @Version: 1.0* @Description:*/@SpringBootApplication@EnableDiscoveryClientpublic class PaymentMain9001 {public static void main(String[] args) {SpringApplication.run(PaymentMain9001.class,args);}}
编写一个测试接口
package com.atguigu.springcloud.controller;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;/*** @auther zzyy* @create -02-23 14:13*/@RestControllerpublic 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;}}
3. 启动测试
启动nacos注册中心,启动新建的9001模块,访问nacos页面
http://localhost:8848/nacos
访问9001接口测试
http://localhost:9001/payment/nacos/1
4. 创建一个9002模块(方便后面负载均衡测试)
真实开发部署时我们9001和9002是一个集群,除了端口不一样其他的都一样,大家可以参照9001创建出一个9002工程,把端口修改下即可。
这里为了方便测试也为了方便大家学习,我演示一种取巧的方法,这里不得不说一句,IDEA牛逼!
大致的操作就是将9001工程虚copy一份(虚拟的复制一份工程),除了端口不同其他的实际上都还是会找9001。
调出Run Dashboard
不会的请移步:https://xiaozhang./article/details/121999966?spm=1001..3001.5502
查看使用Run Dashbord右键9001服务,点击Copy Configxxxx
-DServer.port=9002
已经有了
我们把这个9001和9002都启动起来,在查看nacos,会发现已经有两个实例了
查看详情
在访问下9002的接口
http://localhost:9002/payment/nacos/1
OK,没问题了
5. 创建基于Nacos的服务调用者模块
模块名
cloudalibaba-consumer-nacos-order83
pom依赖
<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.atguigu.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</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>
application.yml
server:port: 83spring:application:name: nacos-order-consumercloud:nacos:discovery:server-addr: localhost:8848#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)service-url:nacos-user-service: http://nacos-payment-provider
包名
com.atguigu.springcloud.alibaba
启动类OrderNacosMain83
package com.atguigu.springcloud.alibaba;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;/*** @auther zzyy* @create -02-23 14:44*/@EnableDiscoveryClient@SpringBootApplicationpublic class OrderNacosMain83{public static void main(String[] args){SpringApplication.run(OrderNacosMain83.class,args);}}
配置RestTemplate
package com.atguigu.springcloud.alibaba.config;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.client.RestTemplate;/*** @auther zzyy* @create -02-23 14:45*/@Configurationpublic class ApplicationContextConfig{@Bean@LoadBalancedpublic RestTemplate getRestTemplate(){return new RestTemplate();}}
6. 编写服务调用业务类
package com.atguigu.springcloud.alibaba.controller;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;import javax.annotation.Resource;/*** @auther zzyy* @create -02-23 15:01*/@RestController@Slf4jpublic class OrderNacosController{@Resourceprivate 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);}}
7. 启动测试调用
启动nacos、9001、9002及83模块,查看服务nacos控制台
http://localhost:8848/nacos
三个服务都已经注册上来
测试通过83服务调用9001/9002微服务及负载均衡,多刷新几次,发现serverport会在9001和9002之间来回变,这就说明已经支持了负载均衡
http://localhost:83/payment/nacos/1
四、Nacos作为服务注册中心的对比
1. Eureka、Zookeeper、Consul的对比
之前SpringCloud注册中心几篇提到的CAP介绍
C: Consistency(强一致性)
A: Availability(可用性)
P: Partition tolerance(分区容错性)
CAP理论关注粒度是数据,而不是整体系统设计的策略
AP(Eureka):AP架构当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性。结论:违背了一致性C的要求,只满足可用性和分区容错,即AP(保障健康的服务,允许心跳停止的服务继续存在)。
CP(Zookeeper/Consul):CP架构当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性结论:违背了可用性A的要求,只满足一致性和分区容错,即CP (保障服务一致,发现心跳停止的服务立即干掉)。
2. Nacos:我都要
C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。
何时选择使用何种模式?
一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring cloud 和 Dubbo 服务,都适用于AP模式,AP模式为了服务的可用性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须,K8S服务和DNS服务则适用于CP模式。CP模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
nacos支持CP和AP模式的切换,想要什么姿势都可以!!!
使用POST请求,以下方式即可完成AP和CP模式的切换。
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'