天天看点

gateway nacos注册服务_SpringCloud Alibaba之Nacos服务注册

一. SpringCloud Alibaba简介:

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

依托 Spring Cloud Alibaba,只需要添加一些注解和少量配置,就可以将 Spring Cloud

应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

引用地址: https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

二. 主要功能:

  • 服务限流降级:默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  • 服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
  • 分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
  • 消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
  • 分布式事务:使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。。
  • 阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • 分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。

三. 组件:

Sentinel:把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

Dubbo:Apache Dubbo™ 是一款高性能 Java RPC 框架。

Seata:阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

Alibaba Cloud OSS: 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

Alibaba Cloud SchedulerX: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。

四. 资料:

spring-cloud-alibaba官网:

https://spring.io/projects/spring-cloud-alibaba
           

spring-cloud-alibaba文档:

https://github.com/alibaba/spring-cloud-alibaba/wiki
           

五. Nacos服务注册:

nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

六. 安装:

下载地址,本次以1.1.4版本举例:

https://github.com/alibaba/nacos/releases/tag/1.1.4
           

解压之后点击startup.cmd启动.(Windows版)

gateway nacos注册服务_SpringCloud Alibaba之Nacos服务注册
gateway nacos注册服务_SpringCloud Alibaba之Nacos服务注册
访问:
http://localhost:8848/nacos
           
gateway nacos注册服务_SpringCloud Alibaba之Nacos服务注册

账号密码均为nacos:

gateway nacos注册服务_SpringCloud Alibaba之Nacos服务注册

七. 使用

基于Nacos的服务提供者:

1. 新建cloudalibaba-provider-payment9001工程:
<?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>cloud2020artifactId>        <groupId>com.fastgroupId>        <version>1.0-SNAPSHOTversion>    parent>    <modelVersion>4.0.0modelVersion>    <artifactId>cloudalibaba-provider-payment9001artifactId>    <dependencies>                <dependency>            <groupId>com.alibaba.cloudgroupId>            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>        dependency>                <dependency>            <groupId>org.springframework.bootgroupId>            <artifactId>spring-boot-starter-webartifactId>        dependency>        <dependency>            <groupId>org.springframework.bootgroupId>            <artifactId>spring-boot-starter-actuatorartifactId>        dependency>                <dependency>            <groupId>org.springframework.bootgroupId>            <artifactId>spring-boot-devtoolsartifactId>            <scope>runtimescope>            <optional>trueoptional>        dependency>        <dependency>            <groupId>org.projectlombokgroupId>            <artifactId>lombokartifactId>            <optional>trueoptional>        dependency>        <dependency>            <groupId>org.springframework.bootgroupId>            <artifactId>spring-boot-starter-testartifactId>            <scope>testscope>        dependency>    dependencies>project>
           
2. 编写application.yml配置文件:
server:  port: 9001spring:  application:    name: nacos-payment-provider  cloud:    nacos:      discovery:        server-addr: localhost:8848 #配置Nacos地址management:  endpoints:    web:      exposure:        include: '*'  #暴露所有端点,方便进行监控
           
3. 创建主启动类:
@[email protected]   //开启nacos服务注册与发现功能public class PaymentMain9001 {    public static void main(String[] args) {       SpringApplication.run(PaymentMain9001.class, args);    }}
           
4. Controller:
@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;    }}
           
5. 启动9001,查看nacos后台:
gateway nacos注册服务_SpringCloud Alibaba之Nacos服务注册

不难看出,9001已经成功注册到nacos中.

参照上面的步骤,创建9002.

基于Nacos的服务消费者:

1. 创建cloudalibaba-consumer-nacos-order83工程:
<?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>cloud2020artifactId>        <groupId>com.fastgroupId>        <version>1.0-SNAPSHOTversion>    parent>    <modelVersion>4.0.0modelVersion>    <artifactId>cloudalibaba-consumer-nacos-order83artifactId>    <dependencies>                <dependency>            <groupId>com.alibaba.cloudgroupId>            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>        dependency>                <dependency>            <groupId>com.fastgroupId>            <artifactId>cloud-api-commonsartifactId>            <version>${project.version}version>        dependency>                <dependency>            <groupId>org.springframework.bootgroupId>            <artifactId>spring-boot-starter-webartifactId>        dependency>        <dependency>            <groupId>org.springframework.bootgroupId>            <artifactId>spring-boot-starter-actuatorartifactId>        dependency>                <dependency>            <groupId>org.springframework.bootgroupId>            <artifactId>spring-boot-devtoolsartifactId>            <scope>runtimescope>            <optional>trueoptional>        dependency>        <dependency>            <groupId>org.projectlombokgroupId>            <artifactId>lombokartifactId>            <optional>trueoptional>        dependency>        <dependency>            <groupId>org.springframework.bootgroupId>            <artifactId>spring-boot-starter-testartifactId>            <scope>testscope>        dependency>    dependencies>project>
           
2. 编写application.yml配置文件:
server:  port: 83spring:  application:    name: nacos-order-consumer  cloud:    nacos:      discovery:        server-addr: localhost:8848#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)service-url:  nacos-user-service: http://nacos-payment-provider
           
3. 启动类:
@SpringBoot[email protected] class OrderNacosMain83 {    public static void main(String[] args) {       SpringApplication.run(OrderNacosMain83.class, args);    }}
           
4. nacos默认集成了ribbon,可实现负载均衡.
gateway nacos注册服务_SpringCloud Alibaba之Nacos服务注册
5. 配置RestTemplate:
@Configurationpublic class ApplicationContextConfig{    @Bean    @LoadBalanced    public RestTemplate getRestTemplate(){        return new RestTemplate();    }}
           
6. Controller:
@[email protected] class OrderNacosController{    @Resource    private 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上的注册情况:
gateway nacos注册服务_SpringCloud Alibaba之Nacos服务注册
8. 访问测试
http://localhost:83/consumer/payment/nacos/1#结果nacos registry, serverPort: 9001 id1nacos registry, serverPort: 9002 id1
           

从结果上我们不难看出,每次访问都会走不同的服务端.

八. 服务注册中心对比:

1. Nacos 生态图

gateway nacos注册服务_SpringCloud Alibaba之Nacos服务注册

2. Nacos与其他注册中心对比:

gateway nacos注册服务_SpringCloud Alibaba之Nacos服务注册

九. Nacos支持AP和CP模式的切换:

我们从对比图可以了解到,Nacos同时支持AP和CP模式.

CAP原则的精髓就是要么AP,要么CP,要么AC,但是不存在CAP。

何时选择使用何种模式?

一般来说,

如果不需要存储服务级别的信息且服务实例是通过nacos client注册,并能够保持心跳上报,那么就可以选择AP模式。

当前主流的服务如Spring cloud和Dubbo服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性, 因此AP模式下只支持注册临时实例。

如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8S服务和DNS服务则适用于CP模式。

CP模式下则支持注册持久化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

Nacos 集群默认支持的是CAP原则中的AP原则,但是也可切换为CP原则,切换命令如下:

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
           

同时微服务的bootstrap.properties 需配置如下选项指明注册为临时/永久实例

AP模式不支持数据一致性,所以只支持服务注册的临时实例,CP模式支持服务注册的永久实例,满足配置文件的一致性

#false为永久实例,true表示临时实例开启,注册为临时实例spring.cloud.nacos.discovery.ephemeral=false