SpringCloud整合Nacos

1 Nacos介绍

Nacos,全称Dynamic Naming and Configuration Service,Nacos 致力于发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,能够快速实现动态服务发现、服务配置、服务元数据及流量管理。能够更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:

  • Kubernetes Service
  • gRPC & Dubbo RPC Service
  • Spring Cloud RESTful Service

与Eureka的对比
学过SpringCloud的人都知道Eureka注册中心,帮助管理进行服务发现、管理微服务,Config配置中心,负责管理配置信息,Bus消息总线,配合Config配置中心实现配置动态刷新。因此简单来说,Nacos一个人把这三个组件的活都干了,并且功能更强大,更简便。Nacos就是注册中心+配置中心的组合 -> Nacos = Eureka+Config+Bus,Nacos的文档为Nacos文档,其源码也开放到github中,要下载源码或者下载安装的可以进入https://github.com/alibaba/nacos/releases进行下载,安装配置参见:SpringCloud整合Seata分布式事务(上)之基础环境搭建中的Nacos环境准备部分。关于Spring Cloud Alibaba文档我们可以参见:Spring Cloud Alibaba参考文档

2 Nacos特性介绍

服务发现和服务健康监测

Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。

Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

动态配置服务

动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。

配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

动态 DNS 服务

动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

服务及其元数据管理

Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

Nacos与其它注册中心的对比
SpringCloud整合Nacos_第1张图片
SpringCloud整合Nacos_第2张图片
从上面我们可以看出,Nacos是真的非常强大,且支持CP和AP模式切换。C是所有节点在同一时间看到的数据是一致的(一致性),而A的定义是所有的请求都会收到响应(可用性),P是分区容错性。

何时选择使用何种模式?

—般来说,如果不需要存储服务级别的信息且服务实例是通过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

3 SpringCloud Alibaba整合Nacos

首先需要下载好Nacos。关于Linux如何下载Nacos,移步我之前的博客

3.1 服务注册发现

服务提供者一为:cloudalibaba-provider-payment9001,其pom文件如下:

    <dependencies>
        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-alibaba-dependenciesartifactId>
            <version>2.2.0.RELEASEversion>
            <type>pomtype>
            <scope>importscope>
        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>

yml配置文件

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

management: ##暴露监控端点,此时curl -X POST "http://localhost:3355/actuator/refresh" 进行刷新即可同步最新配置
  endpoints:
    web:
      exposure:
        include: "*"

controller

package com.dl.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/payment/")
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping("nacos")
    public String getPayment(@RequestParam("id")Integer id){
        return "nacos registry,serverPort:"+serverPort+"\t id"+id;
    }
}

主启动类

package com.dl;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient // 开启服务注册发现功能
public class Payment9001Application {
    public static void main(String[] args) {
        SpringApplication.run(Payment9001Application.class,args);
    }
}

上面就构建好一个简单的服务提供者了,并将其注册进入Nacos中,第二个服务提供者和上面的一样的只有端口号不一样,可以采用一些投机取巧的办法启动两个服务,比如先启动9001之后,在修改yml,然后点主启动类的运行就可以启动两个服务了,当然也可以按照如下操作重新copy一份启动配置进行参数修改。
SpringCloud整合Nacos_第3张图片
修改Name为Payment9011Application以及加上启动参数端口号-DServer.port=9011
SpringCloud整合Nacos_第4张图片
然后找到9011进行启动
SpringCloud整合Nacos_第5张图片
此时访问Nacos管理控制台发现已经注册两个实例进去了,服务名正式我们yml配置文件中编写的nacos-payment-provider
SpringCloud整合Nacos_第6张图片
点击详情发现正是我们的9001和9011,说明注册成功。
在这里插入图片描述
接下来编写服务消费者测试负载均衡。

cloudalibaba-consumer-nacos-order83
导入依赖

    <dependencies>
        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-alibaba-dependenciesartifactId>
            <version>2.2.0.RELEASEversion>
            <type>pomtype>
            <scope>importscope>
        dependency>
        
        <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>

yml配置文件

server:
  port: 83

spring:
  application:
    name: nacos-order-consumer #微服务名
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos地址

#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

主启动类

package com.dl;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient // 开启服务注册发现功能
public class OrderNacos83Application {
    public static void main(String[] args) {
        SpringApplication.run(OrderNacos83Application.class,args);
    }
}

controller

package com.dl.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@Slf4j
@RequestMapping("/consumer/")
public class OrderNacosController {

    @Autowired
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serverURL;

    @GetMapping(value = "payment/nacos")
    public String paymentInfo(@RequestParam("id") Integer id) {
        return restTemplate.getForObject(serverURL+"/payment/nacos?id="+id,String.class);
    }
}

在controller中我们通过RestTemplate调用Nacos中的服务。接下来是RestTemplate的配置类:

package com.dl.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;

@Configuration
public class RestConfig {
    @Bean
    @LoadBalanced //负载均衡
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

由于服务提供者超过一个,因此需要进行负载均衡分摊服务提供者压力。使用cloud提供的原生注解@LoadBalanced即可提供负载均衡功能,默认使用的是轮询算法。
接下来启动消费者客户端,调用相应的接口即可进行验证服务注册发现与负载均衡功能了。
调用url:http://localhost:83/consumer/payment/nacos?id=13

3.2 Nacos作为配置中心

关于这个,具体操作移步我的另一篇博客
https://blog.csdn.net/weixin_42225792/article/details/118060787?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164993302316780366543307%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=164993302316780366543307&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-118060787.nonecase&utm_term=nacos%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83&spm=1018.2226.3001.4450

你可能感兴趣的:(Java基础,其它框架及组件,java,分布式)