springcloud03-Nacos配置中心

通过配置中心,实现mysql、mybatis连接的动态配置

一、搭建一个provider服务

连接mysql、myabtis-plus,提供接口

1、创建项目

2、配置文件和jar包

复制代码
<dependencies>
     <dependency>
            <groupId>com.hl</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
     </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.9</version>
    </dependency>
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 设置配置中心服务端地址
spring.cloud.nacos.config.server-addr=localhost:8848


# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可
# spring.cloud.nacos.config.namespace=
spring.config.import=nacos:provider.yml?refresh=true
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# 在nacos注册中心暴漏的服务名
spring.application.name=provider
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public


# 应用服务 WEB 访问端口
server.port=8080

#mysql
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ry-vue
    username: root
    password: 123456
#mybatis-plus
mybatis-plus:
  mapper-locations: classpath*:/mapper/*.xml
  type-aliases-package: com.hl.entity
  configuration:
    map-underscore-to-camel-case: true

3、补全包结构和基本文件

复制代码
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan(basePackages = "com.hl.mapper")
public class ProviderApplication {

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

}

4、写web层,测试

复制代码
package com.hl.web;

import com.hl.entity.SysPost;
import com.hl.service.SysPostService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/post")
public class PostController {
    @Autowired
    private SysPostService sysPostService;

    @RequestMapping("/list")
    public List<SysPost> postList(){
        return sysPostService.list();
    }
}

5、将数据库连接的配置文件放到nacos配置中心

二、搭建一个consumer消费者服务

1、创建消费者模块

2、补全配置文件

3、声明远程调用的api接口

复制代码
@FeignClient(value = "provider")
public interface SysPostFeign {
    @RequestMapping("/post/list")
    public List<SysPost> postList();
}

4、通过web层远程调用

复制代码
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
    //远程调用api接口(openFeign)
    @Autowired
    private SysPostFeign sysPostFeign;
    @RequestMapping("/list")
    public List<SysPost> postList(){
        return sysPostFeign.postList();
    }
}

http://localhost:8082/consumer/list

Gateway网关服务

微服务架构提供一种简单有效的统一的 API 路由管理方式

Spring Cloud Gateway 底层使用了高性能的通信框架Netty

安全,监控/指标,和限流。

统一项目入口,安全,监控/指标,和限流、路由、负载均衡服务器。

Spring Cloud Gateway 网关的作用

Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个 API 网关服务,基于 Spring 5、Spring Boot 2 和 Project Reactor 等技术构建。它的主要作用包括:

核心功能

  1. 路由转发

    • 根据请求路径、主机、头信息等条件将请求转发到不同的微服务

    • 支持动态路由配置

  2. 负载均衡

    • 集成 Ribbon 实现客户端负载均衡

    • 自动将请求分发到多个服务实例

  3. 请求过滤

    • 提供前置(PRE)和后置(POST)过滤器

    • 可自定义全局过滤器和路由过滤器

重要特性

  1. 安全控制

    • 统一认证和授权

    • 支持 JWT、OAuth2 等安全协议

    • 防止 SQL 注入、XSS 等攻击

  2. 流量控制

    • 限流(Rate Limiting)

    • 熔断(集成 Hystrix 或 Resilience4j)

  3. 协议转换

    • 支持 HTTP 与 WebSocket 协议转换

    • 可处理 REST 和 gRPC 请求

  4. 监控与日志

    • 集中收集请求日志

    • 集成监控组件如 Prometheus

  5. 跨域支持

    • 统一处理 CORS 跨域请求

优势

  • 高性能:基于 Netty 的非阻塞异步模型

  • 易扩展:通过过滤器链机制高度可定制

  • 声明式配置:支持 YAML 和 Java DSL 配置方式

  • 服务发现集成:完美兼容 Eureka、nacos等服务注册中心

Spring Cloud Gateway 作为微服务架构的入口,有效解决了微服务架构中的统一访问、安全控制、流量管理等问题,是构建现代云原生应用的重要组件。

1、搭建网关服务

gateway使用了netty框架进行通信,无需引入spring-boot-starter-web。

复制代码
nacos-discovery
nacos-config
spring-cloud-gateway
loadBalancer

2、利用网关统一项目入口,转发请求到目标服务

复制代码
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        #id : 唯一标识 一般和服务名相同
        #uri : 路由转发地址
        #predicates:路由规则匹配,断言匹配
        - id: provider
          uri: http://localhost:8080/
          predicates:
            - Path=/p/**
        #http://localhost:10010/p/post/list -> http://localhost:8080/p/post/list

http://localhost:10010/p/post/list

http://localhost:8080/p/post/list

3、了解网关鉴权

路由转发功能
1)静态路由模式
复制代码
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        #id : 唯一标识 一般和服务名相同
        #uri : 路由转发地址
        #predicates:路由规则匹配,断言匹配   静态路由
        - id: provider
          uri: http://localhost:8080/  
          predicates:
            - Path=/p/**
          #http://localhost:10010/p/post/list -> http://localhost:8080/p/post/list

		# 静态路由
        - id: consumer   
          uri: http://localhost:8082/ 
          predicates:
            - Path=/c/**
          filters:
            - StripPrefix=1  #删除前缀路径  删除一层
          #http://localhost:10010/c/consumer/list -> http://localhost:8082/c/consumer/list
          #删除前缀路径  删除一层
          #http://localhost:8082/consumer/list
2)动态路由模式
复制代码
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        #id : 唯一标识 一般和服务名相同
        #uri : 路由转发地址
        #predicates:路由规则匹配,断言匹配
        - id: provider
#          uri: http://localhost:8080/  #静态路由
          uri: lb://provider    #动态路由
          predicates:
            - Path=/p/**
          #http://localhost:10010/p/post/list -> http://localhost:8080/p/post/list

        - id: consumer
#          uri: http://localhost:8082/  #静态路由
          uri: lb://consumer    #动态路由
          predicates:
            - Path=/c/**
          filters:
            - StripPrefix=1  #删除前缀路径  删除一层
          #http://localhost:10010/c/consumer/list -> http://localhost:8082/c/consumer/list
          #删除前缀路径  删除一层
          #http://localhost:8082/consumer/list

测试负载均衡,配置文件无需修改。

设置provider以多实例模式运行。添加日志输出,查看运行效果。

4、添加局部过滤器

复制代码
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        #id : 唯一标识 一般和服务名相同
        #uri : 路由转发地址
        #predicates:路由规则匹配,断言匹配
        - id: provider
#          uri: http://localhost:8080/  #静态路由
          uri: lb://provider    #动态路由
          predicates:
            - Path=/p/**
          filters:
            - StripPrefix=1  #删除前缀路径  删除一层
            - PrefixPath=/p
            - AddRequestParameter=name,zhangsan
          #http://localhost:10010/p/post/list -> http://localhost:8080/p/post/list


        - id: consumer
#          uri: http://localhost:8082/  #静态路由
          uri: lb://consumer    #动态路由
          predicates:
            - Path=/c/**
          filters:
            - StripPrefix=1  #删除前缀路径  删除一层
          #http://localhost:10010/c/consumer/list -> http://localhost:8082/c/consumer/list
          #删除前缀路径  删除一层
          #http://localhost:8082/consumer/list

5、添加全局过滤器

复制代码
package com.hl.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/*
全局过滤器
 */
@Component
public class GlobalGatewayFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("filter.........");
        //放行,继续到达下一个过滤器
        return chain.filter(exchange);
    }
    //数字越小,执行越往前
    @Override
    public int getOrder() {
        return 0;
    }
}
相关推荐
程序员良辰16 分钟前
Spring与SpringBoot:从手动挡到自动挡的Java开发进化论
java·spring boot·spring
鹦鹉00719 分钟前
SpringAOP实现
java·服务器·前端·spring
练习时长两年半的程序员小胡1 小时前
JVM 性能调优实战:让系统性能 “飞” 起来的核心策略
java·jvm·性能调优·jvm调优
崎岖Qiu1 小时前
【JVM篇11】:分代回收与GC回收范围的分类详解
java·jvm·后端·面试
27669582923 小时前
东方航空 m端 wasm req res分析
java·python·node·wasm·东方航空·东航·东方航空m端
许苑向上3 小时前
Spring Boot 自动装配底层源码实现详解
java·spring boot·后端
喵叔哟4 小时前
31.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--财务服务--收支分类
java·微服务·.net
codu4u13144 小时前
Maven中的bom和父依赖
java·linux·maven
呦呦鹿鸣Rzh4 小时前
微服务快速入门
java·微服务·架构
今天也好累5 小时前
C 语言基础第16天:指针补充
java·c语言·数据结构·笔记·学习·算法