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.Driverurl: jdbc:mysql://localhost:3306/ry-vueusername: rootpassword: 123456
#mybatis-plus
mybatis-plus:mapper-locations: classpath*:/mapper/*.xmltype-aliases-package: com.hl.entityconfiguration: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 {@Autowiredprivate 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)@Autowiredprivate 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: trueroutes:#id : 唯一标识 一般和服务名相同#uri : 路由转发地址#predicates:路由规则匹配,断言匹配- id: provideruri: 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: trueroutes:#id : 唯一标识 一般和服务名相同#uri : 路由转发地址#predicates:路由规则匹配,断言匹配 静态路由- id: provideruri: 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: trueroutes:#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: trueroutes:#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 {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {System.out.println("filter.........");//放行,继续到达下一个过滤器return chain.filter(exchange);}//数字越小,执行越往前@Overridepublic int getOrder() {return 0;}
}