并修改端口号
(2)加入相关的依赖
-
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-starter-gatewayartifactId>
- dependency>
- server:
- port: 7000
-
- spring:
- application:
- name: springcloud-gateway
- @SpringBootApplication
- public class GatewayApp {
- public static void main(String[] args) {
- SpringApplication.run(GatewayApp.class,args);
- }
- }
发现 : 路由配置时 uri 的地址还是一个固定的网络地址,如果后期微服务地址发送改变,也需要修改网关的配置。 不能完成负载均衡。解决 : gateway 也是一个微服务,它可以从注册中心拉取服务信息
1.引入依赖
-
-
com.alibaba.cloud -
spring-cloud-starter-alibaba-nacos-discovery -
2.修改配置文件指定注册中心地址
- # 路由转发 List<RouteDefinition> routes
- cloud:
- gateway:
- routes:
- - id: qy-zsy-product
- # 路由转发的真实地址 lb://微服务名称 默认采用ribbon负载均衡
- uri: lb://qy-zsy-product
- # predicates: 断言 当满足断言时,才会转发到真实的uri地址
- predicates:
- - Path=/product/**
-
- - id: qy-zsy-order
- # http://localhost:8092/order/buy/1/100
- uri: lb://qy-zsy-order
- predicates:
- - Path=/order/**
-
-
-
- # 指定注册中心的地址
- nacos:
- server-addr: localhost:81
发现: 有一个微服务需要配置一个路由,如果这时增加一个新的微服 务,则需要在配置文件中增加一个新的路由配置。能不能自动路由转发微服务呢! 可以
全局过滤器
1.引入fastjson依赖
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>fastjsonartifactId>
- <version>1.2.83version>
- dependency>
2.创建Anon实体类
- @Component
- @ConfigurationProperties(prefix = "anon")
- public class Anon {
- private List
url; - public List
getUrl(){ - return url;
- }
- public void setUrl(List
url) { - this.url=url;
- }
- }
3.定义全局过滤器
- @Component
- public class LoginFilter implements GlobalFilter, Ordered {
-
- @Autowired
- private Anon anon;
-
- //过滤方法 过滤业务
- @Override
- public Mono
filter(ServerWebExchange exchange, GatewayFilterChain chain) { - ServerHttpRequest request = exchange.getRequest();
- ServerHttpResponse response = exchange.getResponse();
- //获取请求
- String path = request.getPath().toString();
- //判断当前的请求路径是否为放行路径
- if(anon.getUrl().contains(path)){
- //放行
- return chain.filter(exchange);
- }
-
- //判断是否携带token
- String token = request.getHeaders().getFirst("token");
- //redis
- if(StringUtils.hasText(token)&&"admin".equals(token)){
- //放行
- return chain.filter(exchange);
- }
-
- //返回一个json数据
- //设置状态码
- response.setStatusCode(HttpStatus.UNAUTHORIZED);
-
- //封装返回数据
- Map
map = new HashMap<>(); - map.put("msg","未登录");
- map.put("code",4000);
-
- //json转换
- byte[] bytes = JSON.toJSONString(map).getBytes(StandardCharsets.UTF_8);
-
- //调用bufferFactory方法,生成DataBuffer对象
- DataBuffer buffer = response.bufferFactory().wrap(bytes);
-
- //调用Mono中的just方法,返回给前端的json数据
- return response.writeWith(Mono.just(buffer));
- }
-
- @Override
- // 优先级 返回的值越小优先级越高
- public int getOrder() {
- return 0;
- }
- }