1.创建数据库---- 自带
2.指定使用mysql作为数据存储application.properties
3.配置集群文件
4.停止nacosbing 复制三分
并修改其中端口号跟名字一一对应
5.启动nacos默认以集群的模式开启
nginx修改
微服务注册到nacos集群上 nginx 代理nacos地址为localhost:81
建立模块gateway
导入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
yml文件配置
server: port: 7000 spring: application: name: springcloud-gateway ???? cloud: gateway: routes: - id: springcloud-product # ????????? lb://eureka-product????? uri: lb://eureka-product # predicates:???????????????uri? ?? predicates: - Path=/product/** - Method=Post ??????ip/24???255.255.255??? - RemoteAddr=162.168.1.130 - id: springcloud-order # ????????? uri: lb://springcloud-order # predicates:???????????????uri? ?? predicates: - Path=/order/**
#????gateway?????? cloud: gateway: discovery: locator: enabled: true #????????? nacos: server-addr: localhost:81 anon: url: - /sso/login - /product/getMsg
Anon
@Component @ConfigurationProperties(prefix = "anon") public class Anon { private List<String> url; public List<String> getUrl() { return url; } public void setUrl(List<String> url) { this.url = url; } }
LoginFilter
@Component public class LoginFilter implements GlobalFilter, Ordered { @Autowired private Anon anon; @Override //过滤方法 过滤业务 public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); ServerHttpResponse response = exchange.getResponse(); //0.获去请求 String path = request.getPath().toString(); //1.判断房前路径是否为放行路径 if(anon.getUrl().contains(path)){ return chain.filter(exchange);//放行 } //2.判断是否携带token String token = request.getHeaders().getFirst("token"); if(StringUtils.hasText(token)&&"admin".equals(token)){ return chain.filter(exchange);//放行 } //3.返回一个json数据。 //3.1设置状态码 response.setStatusCode(HttpStatus.UNAUTHORIZED); //3.2封装返回数据 Map<String, Object> map = new HashMap<>(); map.put("msg", "未登录"); map.put("code", 4000); //3.3作JSON转换 byte[] bytes = JSON.toJSONString(map).getBytes(StandardCharsets.UTF_8 ); //3.4调用bufferFactory方法,生成DataBuffer对象 DataBuffer buffer = response.bufferFactory().wrap(bytes); //4.调用Mono中的just方法,返回要写给前端的JSON数据 return response.writeWith(Mono.just(buffer)); } @Override //优先级 返回的值越小优先级越高 public int getOrder() { return 0; } }