通过配置中心,实现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 等技术构建。它的主要作用包括:
核心功能
-
路由转发:
-
根据请求路径、主机、头信息等条件将请求转发到不同的微服务
-
支持动态路由配置
-
-
负载均衡:
-
集成 Ribbon 实现客户端负载均衡
-
自动将请求分发到多个服务实例
-
-
请求过滤:
-
提供前置(PRE)和后置(POST)过滤器
-
可自定义全局过滤器和路由过滤器
-
重要特性
-
安全控制:
-
统一认证和授权
-
支持 JWT、OAuth2 等安全协议
-
防止 SQL 注入、XSS 等攻击
-
-
流量控制:
-
限流(Rate Limiting)
-
熔断(集成 Hystrix 或 Resilience4j)
-
-
协议转换:
-
支持 HTTP 与 WebSocket 协议转换
-
可处理 REST 和 gRPC 请求
-
-
监控与日志:
-
集中收集请求日志
-
集成监控组件如 Prometheus
-
-
跨域支持:
- 统一处理 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;
}
}