spring cloud整合nacos的服务的注册与发现和配置动态刷新

前言:这篇笔记简单的记录下微服务,在大型内网中这种构建会经常遇到,如果不知道如何操作的话就会遗漏许多有用的东西,所以这边学习下,这篇笔记主要记录nacos整合spring cloud笔记。

参考文章:https://nacos.io/zh-cn/docs/what-is-nacos.html
参考文章:https://github.com/alibaba/nacos/releases/tag/2.1.0
参考文章:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
参考文章:https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/nacos-spring-cloud-provider-example

nacos介绍

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

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。

服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:

  • Kubernetes Service

  • gRPC & Dubbo RPC Service

  • Spring Cloud RESTful Service

今天的话主要学习的是nacos配合Spring Cloud RESTful Service构建的微服务框架,需要注意下Spring Cloud本身已经是微服务了,而nacos是能够帮助Spring Cloud更好的交付和管理微服务框架。

nacos搭建

我直接在https://github.com/alibaba/nacos/releases/tag/2.1.0下载了一份相关的可执行文件,这边以单机模式启动nacos,如下图所示

./startup.sh -m standalone

Spring Cloud搭建

参考文章:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>org.example</groupId>
    <artifactId>untitled</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>spring-cloud-gateway</name>
    <description>spring-cloud-gateway</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-gateway-server</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
            <version>${parent.version}</version>
        </dependency>

        <!--导入actuator依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <version>${parent.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.3.14</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

        <!--导入alibaba-nacos-discovery依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.9.0.RELEASE</version>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.nacos</groupId>
                    <artifactId>nacos-client</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--导入alibaba-nacos-config依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <!--导入alibaba-nacos-client依赖-->
        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.6.RELEASE</version>
                <scope>import</scope>
                <type>pom</type>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

NacosDiscoveryPropertiesConfig.java

package com.test;

import org.springframework.cloud.alibaba.nacos.NacosDiscoveryProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class NacosDiscoveryPropertiesConfig {

    @Bean
    public NacosDiscoveryProperties nacosDiscoveryProperties(){
        return new NacosDiscoveryProperties();
    }
}

启动类 SpringCloudGatewayApplication.java

package com.test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
@EnableDiscoveryClient
public class SpringCloudGatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(com.test.SpringCloudGatewayApplication.class, args);
    }
}

application.yml

server:
  port: 8081

management:
  endpoint:
    gateway:
      enabled: true
  endpoints:
    web:
      exposure:
        include: gateway


spring:
  application:
    name: spring-cloud-gateway # gateway应用名称
  cloud:
    gateway:
      routes:
        - id: index
          uri: http://www.4399.com
          predicates:
            - Path=/example

bootstrap.yml

## bootstrap.yml

spring:
  cloud:
    nacos:
      config:
        name: gateway
        file-extension: yaml
        group: DEFAULT_GROUP
        server-addr: localhost:8848
      discovery:
        server-addr: localhost:8848

nacos的服务注册和发现

把nacos和Spring cloud都启动之后,访问nacos如下图所示,可以看到存在一个服务名,对应的就是spring.application.name,也就是当前gateway的名称

上面可以看到默认已经添加了一个路由了,当访问/exmaple时候会跳转到http://www.4399.com

    gateway:
      routes:
        - id: index
          uri: http://www.4399.com
          predicates:
            - Path=/example

这边进行测试,如下图所示,可以看到返回的页面内容就是4399相关的内容

这里提下为什么要配置spring.application.name,因为注册服务中心对应的服务都是以这个spring.application.name来定位的,如果没有以应用名称来注册的话后续也就无法在这个服务上面配置相关的信息了。

nacos的配置动态刷新

这边创建一个新的配置集合,需要注意的是这边的Data ID一定需要为gateway,也就是spring.cloud.nacos.config的name值

spring:
  cloud:
    gateway:
      routes:
        - id: index2
          uri: http://www.baidu.com
          predicates:
            - Path=/baidu

这边访问该服务的/baidu接口可以看到已经跳转到baidu的页面了,如下图所示

多服务的情况

参考文章:https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example/nacos-spring-cloud-provider-example

上面的情况只启动了一个名称叫做spring-cloud-gateway,这边的再加一个微服务运行

这边启动的工程是nacos官方示例的一个service-provider微服务

运行起来之后,这边再来到nacos的服务列表中,可以看到多出来了一个对应的service-provider的服务

服务详情可以看到监听在8082端口上的一个spring cloud服务

gateway网关路由转发服务请求

作为gateway网关,不仅可以对指定路由转发请求uri,还可以将指定路由转发到其他的服务中去,这边比如就模拟一个请求/echo/baidu,转发到service-provider服务上去

这边在gatway配置集合上加上对于/echo/baidu的时候,将请求转发到service-provider服务上去,如下图所示

到请求/echo/baidu的时候就会请求到service-provider服务上面,在service-provider服务代码中写了一个对应的/echo/的接口,如下图所示

	@RestController
	class EchoController {
		@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
		public String echo(@PathVariable String string) {
			return "Hello Nacos Discovery service-provider " + string;
		}
	}

最终的效果如下图所示,当请求了/echo/baidu,那么返回包中显示的就是Hello Nacos Discovery baidu

posted @ 2023-08-29 15:06  zpchcbd  阅读(371)  评论(0)    收藏  举报