【微服务】之Nacos和SpringCloud无缝衔接【超详细】

❤️❤️❤️
哈喽~大家好,欢迎进入本人【图图是个好孩纸】的博客

是一名主攻Java后端的程序猿,对前端也有一定的了解,未来持续更新更多的【后端技术】&【学习心得】

如果对【Java后端技术】感兴趣的大可爱或小可爱,欢迎关注【图图是个好孩纸】~
❤️❤️❤️

什么是 Nacos?

1、概述

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

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

2、什么是 Nacos?

Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:

Kubernetes Service

gRPC & Dubbo RPC Service

Spring Cloud RESTful Service

nacos关键特性

        服务发现和服务健康监测

        动态配置服务

        动态 DNS 服务

        服务及其元数据管理

详细介绍请参考nacos官网文档:https://nacos.io/zh-cn/docs/what-is-nacos.html

3、Nacos 生态图

【微服务】之Nacos和SpringCloud无缝衔接【超详细】_第1张图片

如 Nacos 全景图所示,Nacos 无缝支持一些主流的开源生态,例如

  • Spring Cloud
  • Apache Dubbo and Dubbo Mesh
  • Kubernetes and CNCF

无缝衔接springcould和nacos

1、下载nacos 版本为Windows

进入nacos官网,从nacos官网GitHub上下载nacos,我们这里下载Windows版本基本

Release 2.1.0 (Apr 29, 2022) · alibaba/nacos · GitHub

【微服务】之Nacos和SpringCloud无缝衔接【超详细】_第2张图片

2、启动nacos

在其bin目录下,使用管理员方式运行

在cmd界面使用启动命令

startup.cmd -m standalone

【微服务】之Nacos和SpringCloud无缝衔接【超详细】_第3张图片

 【微服务】之Nacos和SpringCloud无缝衔接【超详细】_第4张图片

启动成功访问页面:

192.168.1.1:8848/nacos/index.html

【微服务】之Nacos和SpringCloud无缝衔接【超详细】_第5张图片

3、版本分支

适配 Spring Boot 为 2.4, Spring Cloud Hoxton 版本及以下的 Spring Cloud Alibaba 版本如下表(最新版本用*标记):

来自官网解说:

版本说明 · alibaba/spring-cloud-alibaba Wiki · GitHub

Spring Cloud Alibaba Version

Spring Cloud Version Spring Boot Version

2.2.8.RELEASE*

Spring Cloud Hoxton.SR12

2.3.12.RELEASE

2.2.7.RELEASE

Spring Cloud Hoxton.SR12

2.3.12.RELEASE

2.2.6.RELEASE

Spring Cloud Hoxton.SR9

2.3.2.RELEASE

2.1.4.RELEASE

Spring Cloud Greenwich.SR6

2.1.13.RELEASE

2.2.1.RELEASE

Spring Cloud Hoxton.SR3

2.2.5.RELEASE

2.2.0.RELEASE

Spring Cloud Hoxton.RELEASE

2.2.X.RELEASE

2.1.2.RELEASE

Spring Cloud Greenwich

2.1.X.RELEASE

2.0.4.RELEASE(停止维护,建议升级)

Spring Cloud Finchley

2.0.X.RELEASE

1.5.1.RELEASE(停止维护,建议升级)

Spring Cloud Edgware

1.5.X.RELEASE

4、创建客户端(提供者)nacos-user-provider工程

 pom.xml

        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

application.yml

server:
  port: 6001
spring:
  application:
    name: nacos-user-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

创建控制器  RestUserController

@RestController
public class RestUserController {

    @GetMapping("/login")
    public String login(String name) {
        return "提供者接受信息:" + name;
    }


}

配置启动类

通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:

@EnableDiscoveryClient
@SpringBootApplication
public class NacosUserProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosUserProviderApplication.class, args);
    }

}

5、创建客户端(消费者)nacos-user-consumer工程

pom.xml

        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.springframework.cloud
            spring-cloud-starter-openfeign
        

        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

application.yml

# 应用服务 WEB 访问端口
server:
  port: 6501
spring:
  application:
    name: nacos-user-consumer   # 应用名称
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
#开启熔断器
feign:
  hystrix:
    enabled: true

创建UserFeignClient 调用客户端(提供者)

//value 指要调用哪个提供者,  fallback 指实现熔断器的类
@FeignClient(value = "nacos-user-provider", fallback = UserFeignClientFallback.class)
public interface UserFeignClient {

    @GetMapping("/login")
    String login(@RequestParam("name") String name);
}

创建UserFeignClientFallback 熔断器

@Component
public class UserFeignClientFallback implements UserFeignClient {

    @Override
    public String login(@RequestParam("name") String name) {
        return "触发了熔断器......值为:" + name;
    }
}

创建UserController 控制器

@RestController
public class UserController {

    @Autowired
    private UserFeignClient feignClient;

    @GetMapping("/dologin")
    public String dologin(String name) {
        return feignClient.login(name);
    }

}

配置启动类

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class NacosUserConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosUserConsumerApplication.class, args);
    }

}

6、创建gateway网关nacos-gateway-server工程

pom.xml

        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

        
            org.springframework.cloud
            spring-cloud-starter-gateway
        

        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
            2.2.2.RELEASE
        

application.yml

server:
  port: 6601
spring:
  application:
    name: nacos-gateway-server #应用程序名称
  cloud:
    gateway:
      routes:
        - id: nacos-user-consumer
          uri: lb://nacos-user-consumer  #要跳转的客户端名称
          predicates:
            - Path=/user/**  #匹配的路径
          filters:
            - RewritePath=/user(?/?.*) , $\{segment} #匹配的路径要替换成 表达式
    nacos:
      discovery:
        server-addr: localhost:8848

创建gateway过滤器 RedisGlobalFilter 

@RefreshScope   //此注解必须打上,用来更新属性
@Component
public class RedisGlobalFilter implements GlobalFilter, Ordered {
    @Value("${token:false}")
    private boolean token = true;

    @Override
    public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //在此处写代码就是pre过滤器
        System.out.println("配置文件的token : " + this.token);
 
        if (!token) {
                ServerHttpResponse response = exchange.getResponse();

                //{"msg":"验证不能通过"}
                byte[] datas = "{\"msg\":\"验证不能通过\"}".getBytes(StandardCharsets.UTF_8);
                DataBuffer buffer = response.bufferFactory().wrap(datas);
                response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
                return response.writeWith(Mono.just(buffer));
        }

        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 1;
    }
}

配置启动类

@EnableDiscoveryClient
@SpringBootApplication
public class NacosGatewayServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosGatewayServerApplication.class, args);
    }

}

7、进入nacos添加配置数据 

【微服务】之Nacos和SpringCloud无缝衔接【超详细】_第6张图片

【微服务】之Nacos和SpringCloud无缝衔接【超详细】_第7张图片

8、使用postman测试

访问nacos你刚远程配置好的数据

http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos-gateway-server.properties&group=DEFAULT_GROUP&content=useLocalCache=false

【微服务】之Nacos和SpringCloud无缝衔接【超详细】_第8张图片

这是我们去修改nacos配置列表属性,添加一个新的属性name 

【微服务】之Nacos和SpringCloud无缝衔接【超详细】_第9张图片

发布后再次访问:

【微服务】之Nacos和SpringCloud无缝衔接【超详细】_第10张图片

说明nacos配置没错

启动我们刚创好的三个工程

nacos-gateway-server
nacos-user-consumer
nacos-user-provider

访问:

localhost:6601/user/dologin?name=张三

【微服务】之Nacos和SpringCloud无缝衔接【超详细】_第11张图片 

【微服务】之Nacos和SpringCloud无缝衔接【超详细】_第12张图片

我们也可以测试去修改nacos中 配置文件信息将token改为false

【微服务】之Nacos和SpringCloud无缝衔接【超详细】_第13张图片

 发布后再次访问:

【微服务】之Nacos和SpringCloud无缝衔接【超详细】_第14张图片

token改为false后无需刷新,重新启动项目,naoco自动刷新这个属性

因为我们在 gateway网关中,去获取远程nacos中的配置属性时,打上该注解

@RefreshScope 

@Value("${token:false}")  //设置默认值

【微服务】之Nacos和SpringCloud无缝衔接【超详细】_第15张图片

 总结:

本章节的思路是使用springcould和nacos进行无缝衔接测试

浏览器请求首先经过gateway网关,根据gateway网关配置不同请求路径,根据不同的请求路径拿取在远程部署的nacos配置服务中获取数据,当nacos配置服务中没有该数据时,则会拦截该请求,不让它再次去访问我们的客户端(消费者),从而减少服务器的压力,起到一定的过滤作用,而nacos的作用呢主要是实现动态服务发现、服务配置、服务元数据及流量管理,起到一个管家的作用,管理者每一个个微小的服务

你可能感兴趣的:(微服务,spring,cloud,gateway,微服务,架构)