spring cloud 整合 nacos

本贴最后更新于 1297 天前,其中的信息可能已经时移世异

1、nacos 简介

Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

nacos-logic.jpg

  • 服务管理:实现服务 CRUD,域名 CRUD,服务健康状态检查,服务权重管理等功能

  • 配置管理:实现配置管 CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能

  • 元数据管理:提供元数据 CURD 和打标能力

  • 插件机制:实现三个模块可分可合能力,实现扩展点 SPI 机制

  • 事件机制:实现异步化事件通知,sdk 数据变化异步通知等逻辑

  • 日志模块:管理日志分类,日志级别,日志可移植性(尤其避免冲突),日志格式,异常码 + 帮助文档

  • 回调机制:sdk 通知数据,通过统一的模式回调用户处理。接口和数据结构需要具备可扩展性

  • 寻址模式:解决 ip,域名,nameserver、广播等多种寻址模式,需要可扩展

  • 推送通道:解决 server 与存储、server 间、server 与 sdk 间推送性能问题

  • 容量管理:管理每个租户,分组下的容量,防止存储被写爆,影响服务可用性

  • 流量管理:按照租户,分组等多个维度对请求频率,长链接个数,报文大小,请求流控进行控制

  • 缓存机制:容灾目录,本地缓存,server 缓存机制。容灾目录使用需要工具

  • 启动模式:按照单机模式,配置模式,服务模式,dns 模式,或者 all 模式,启动不同的程序 +UI

  • 一致性协议:解决不同数据,不同一致性要求情况下,不同一致性机制

  • 存储模块:解决数据持久化、非持久化存储,解决数据分片问题

  • Nameserver:解决 namespace 到 clusterid 的路由问题,解决用户环境与 nacos 物理环境映射问题

  • CMDB:解决元数据存储,与三方 cmdb 系统对接问题,解决应用,人,资源关系

  • Metrics:暴露标准 metrics 数据,方便与三方监控系统打通

  • Trace:暴露标准 trace,方便与 SLA 系统打通,日志白平化,推送轨迹等能力,并且可以和计量计费系统打通

  • 接入管理:相当于阿里云开通服务,分配身份、容量、权限过程

  • 用户管理:解决用户管理,登录,sso 等问题

  • 权限管理:解决身份识别,访问控制,角色管理等问题

  • 审计系统:扩展接口方便与不同公司审计系统打通

  • 通知系统:核心数据变更,或者操作,方便通过 SMS 系统打通,通知到对应人数据变更

  • OpenAPI:暴露标准 Rest 风格 HTTP 接口,简单易用,方便多语言集成

  • Console:易用控制台,做服务管理、配置管理等操作

  • SDK:多语言 sdk

  • Agent:dns-f 类似模式,或者与 mesh 等方案集成

  • CLI:命令行对产品进行轻量化管理

2、nacos 下载启动

下载安装包

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

下载完成后,需要配置 mysql 连接信息,在 nacos 的/conf/application.properties 文件中配置

image.png

然后在数据库中执行 nacos 的数据库脚本/conf/nacos-mysql.sql

然后就可以启动了,启动的时候使用单机模式启动

startup.cmd -m standalone

3、建立一个提供服务的工程

3.1、pom.xml

<?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"> <modelVersion>4.0.0</modelVersion> <artifactId>provider</artifactId> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>0.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> <optional>true</optional> </dependency> </dependencies> </project>

3.2、配置文件

配置文件中指定项目名称和 nacos 的地址

server.port=8081 spring.application.name=nacos-provider spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 management.endpoints.web.exposure.include=*

3.3、接口

建立一个接口,输入是谁调用了这个接口

@SpringBootApplication @EnableDiscoveryClient public class NacosProviderDemoApplication { public static void main(String[] args) { SpringApplication.run(NacosProviderDemoApplication.class, args); } @RestController public class EchoController { @GetMapping(value = "/echo/{string}") public String echo(@PathVariable String string) { return "Hello Nacos Discovery " + string; } } }

4、消费服务的功能

4.1、pom.xml

<?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"> <modelVersion>4.0.0</modelVersion> <groupId>cn.com.wenyl.alibaba</groupId> <artifactId>consumer</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>0.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> <optional>true</optional> </dependency> </dependencies> </project>

4.2、配置文件

server.port=8080 spring.application.name=nacos-consumer spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 management.endpoints.web.exposure.include=*

4.3、接口

建立一个接口,在这个接口中调用了服务提供者的接口

/** * @author Mr.Wen * @version 1.0 * @date 2021-08-24 16:54 */ @SpringBootApplication @EnableDiscoveryClient public class NacosConsumerDemoApplication { public static void main(String[] args) { SpringApplication.run(NacosConsumerDemoApplication.class, args); } @RestController public class NacosController{ @Resource private LoadBalancerClient loadBalancerClient; @Resource private RestTemplate restTemplate; @Value("${spring.application.name}") private String appName; @GetMapping("/echo/app-name") public String echoAppName(){ //Access through the combination of LoadBalanceClient and RestTemplate ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider"); String path = String.format("http://%s:%s/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName); System.out.println("request path:" +path); return restTemplate.getForObject(path,String.class); } } //Instantiate RestTemplate Instance @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }

5、调动

调用服务消费者的消费接口,然后负载均衡客户端选择一个服务进行调用(loadBanceClient 是负载均衡客户端,根据服务名调用服务),返回结果如下

image.png

  • Nacos
    23 引用 • 4 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...