spring cloud 整合 nacos

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

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 关注

相关帖子

欢迎来到这里!

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

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