目录
二、Nacos 简介
三、Nacos注册中心演变及其设计思想
四、Nacos核心功能
五、Nacos的下载与安装
1.各种注册中心比较:
2.Nacos服务端部署
六、Spring Cloud Alibaba基础环境搭建
1 创建父工程及公共api
1.1 创建父工程
1.2、创建公共API
1.3、创建实体类及打包
1.4、完善父工程 pom
Nacos客户端服务环境搭建
创建基于Nacos的服务提供者
创建基于Nacos的服务提供者
5、服务注册中心对比
SpringCloudAlibaba学习文档
Nacos是Naming Service(服务注册中心) 和 Configuration Service(配置中心)的 缩写。
官方:一个更易于构建云原生应用的动态服务发现(Nacos DKcovery )、服务配置(Nacos Contig)和服务管理平台。
服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于服务的动态扩缩容。Nacos Discovery Starter可以松助您将服务自动注册到Nacos服务端,并且能够动态感知和刚新某个服务实例的服务列表。除此之外,Nacos Discovery Starter 也将服务实例自身的一些元数据信息-例如host,port,健康检查URL,主页等-注册到Nacos 。Nacos的获取和启动方式可以参考Nacos官网。
简单来说:就是 集注册中心+配置中心+服务管理平台 的组合 即 Nacos = Eureka+Config+Bus
Nacos的关键特性包括:
分布式架构的远程服务式调用
String url = "http://localhost:8010/order/findOrderByuserId/"+id;
ResponseEntity responseEntity m restTemplate.getForEntity(url,List.class);
List orderList = responseEntity.getBody();
分布式架构的 远程服务式调用 的弊端,当发生服务的迁移或者是服务的扩容, 此时需要手动修改远程服务地址。并进行代码的重新编译和部署。
解决方案:
使用注册表,将所有的远程服务地址全部放到注册表中。每个远程服务地址存一个对应的服务名称,会员服务则会通过订单服务名称 ,查出订单服务的地址进行调用。
问题发现:
如果订单服务进行水平扩展进行扩容,则需要对其服务进行维护管理,将扩容的服务IP:PORT也存入到列表中,但存在问题是困难,需要手动将扩容的进行维护。
解决方案:
使用负载均衡器 Ngnix ,将所有的远程服务地址全部放到Ngnix中。
问题发现:
如果使用 Ngnix ,如果某个服务挂掉,则Ngix没有进行服务实时监控和检查的功能,因此无法发现挂掉的服务,且成百上千个的服务地址都配置在这个Nginx中,需要频繁的修改和配置远程服务地址,手动配置容易出错,因此对于运维人员服务是灾难性的。
解决方案:
使用服务注册中心,在会员启动时候调用注册接口执行 insert ,注册到 mysql 中,每次会员调用订单服务前都会去获取订单服务列表,就是去 mysql 中执行 select。而订单服务启动的时候也会调用注册接口执行 insert ,注册到 mysql 中。
问题发现:
如果订单服务进行水平扩展,如果其中某台服务挂掉, 则此注册中心不会通知,会员服务仍然会调用此服务。
解决方案:
改善服务注册中心,引入心跳机制,服务会在本地维护一个定时任务,每隔5秒发送一次心跳,如果超过5秒没有收到心跳,则认为当前服务已经是挂掉,将状态修改为 stop 状态。如果超过30秒没有收到服务心跳,则会将服务从注册表中清除。
订单服务维护一个定时任务,会定时调用心跳接口发送心跳,进行和注册中心保持联系,如果服务停止了,则会调用注销接口,将服务停掉。
在会员服务也维护一个定时任务,会定时调用心跳接口发送心跳,进行和注册中心保持联系,如果服务停止了,则会调用注销接口,将服务停掉。
但会员服务同时也维护另一个定时任务,会定时拉取订单服务列表,然后缓存到客户端,然后通过负载均衡器进行远程调用。
CAP:C 一致性 A 可用性 P 分区容错性
Nacos注册中心的使用需要用到注册中心服务端和客户端。
SpringCloud Alibaba Nacos下载地址:https://github.com/alibaba/nacos/releases
官网文档:https://nacos.io/zh-cn/index.html
进入官网,选择合适版本,此处选用最新版本的前一个版本1.4.3稳定版本
下载后安装到哪里解压到哪里,解压nacos后,进入bin目录修改startup.cmd。新版本的nacos默认是以cluster集群方式启动,此时会报错,需要修改startup.cmd的启动方式,修改如下地方。
如需修改各种nacos的各种配置,则进入application.properties修改。如果是单机模式下,则直接默认使用的是内存,如果是集群模式,则可以使用数据源。一般windows中默认使用单机模式。
双击运行startup.cmd启动nacos服务端。
nacos注册服务中心管理可以通过管理平台查看和配置。启动后访问如下:
管理平台:http://192.168.56.21:8848/nacos/index.html#/login
用户名:nacos
密 码:nacos
cloudalibaba-product-server9001
cloudalibaba-product-server9002
cloudalibaba-order-server9000
服务提供者依赖
服务消费者依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
编写配置文件
server:
port: 9999
spring:
application:
#应用名称(nacos会将该名称当做服务名称)
name: nacos-payment-provider
cloud:
#将来要将服务注册到哪个服务中心
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
# springboot actuator 监控
management:
endpoints:
web:
exposure:
include: '*'
server:
port: 9998
spring:
application:
#应用名称(nacos会将该名称当做服务名称)
name: nacos-payment-provider
cloud:
#将来要将服务注册到哪个服务中心
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址
# springboot actuator 监控
management:
endpoints:
web:
exposure:
include: '*'
@SpringBootApplication
@EnableDiscoveryClient //服务注册与发现
public class PaymentMain9999 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9999.class,args);
}
}
@SpringBootApplication
@EnableDiscoveryClient //服务注册与发现
public class PaymentMain9998 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9998.class,args);
}
}
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "nacos registry,serverPort:"+serverPort+"\t"+id;
}
}
cloudalibaba-consumer-nacos-order83
这里消费者远程调用提供者运用OpenFegin进行远程调用,所以引入了OpenFegin的依赖。
org.springframework.cloud
spring-cloud-starter-openfeign
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.atguigu.springcloud
cloud-api-commons
${project.version}
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class OrderNacosMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderNacosMain83.class,args);
}
}
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
@Component
@FeignClient(value = "nacos-payment-provider")
public interface PaymentOpenService {
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id);
}
@RestController
public class PayMentController {
@Autowired
private PaymentOpenService paymentOpenService;
@GetMapping("/consumer/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return paymentOpenService.getPayment(id);
}
}
启动两个提供者和消费者,查看都已注册进nacos
发现调用成功,因为openfegin默认支持ribbon 所以发现进行了轮询。
到此服务注册和发现成功!!!
nacos全景图
nacos和cap
Nacos 支持AP和CP模式的切换
C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。
何时选择使用何种模式?
一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring cloud 和 Dubbo 服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。
如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须,K8S服务和DNS服务则适用于CP模式。
CP模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
第十六章:Spring Cloud Alibaba 基础环境搭建
第十八章:Nacos注册中心详解-入门案例及服务通信