
创建成功后




注意:在连接数据库之前,要先测试数据库是否可以远程连接,如果不能,则需要为数据库配置远程连接。
然后找到 bin/startup.cmd 将三个nacos全部启动
启动成功后

注意:这里开启的nginx是windows版本
打开 conf/nginx.conf

在任务管理中的详细信息找到如下图所示,表示成功

开启成功后,登录nacos。账号和密码默认都是nacos,出现下图的情况,就证明集群模式创建成功了


(1)创建一个gateway微服务模块

org.springframework.cloud spring-cloud-starter-gateway com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
(3)配置文件
server :port : 7000spring :application :name : springcloud-gateway# 路由转发 Listroutes cloud :gateway :routes : 12 - id : springcloud-product# 路由转发的真实地址uri : http : //localhost : 8081# predicates: 当满足断言时,才会转发到真实的 uri 地址。predicates :- Path=/product/**
(4)主启动类
@SpringBootApplication
public class Gateway {
public static void main(String[] args) {
SpringApplication.run(Gateway.class,args);
}
}

com.alibaba.cloud spring-cloud-starter-alibaba- nacos-discovery
如果在访问订单微服务也就是 lb://springcloud-order 时出现 503 的情况 ,可以将lb://springcloud-order 装换为http://127.0.0.1:(订单微服务的端口号)
cloud: gateway: discovery: locator: enabled: true nacos: server-addr: localhost:81
(1)配置类进行跨域

(2)注解进行网关跨域
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods:
- GET
- POST
- DELETE
- PUT
- OPTION
在 gateway 中内置很多断言器,SpringCloud Gateway 包括许多内置的断言工厂,所有这些断言都与HTTP 请求的不同属性匹配体如下:l * 基于 **Datetime** 类型的断言工厂 *此类型的断言根据时间做判断,主要有三个:AfterRoutePredicateFactory : 接收一个日期参数,判断请求日期是否晚于指定日期BeforeRoutePredicateFactory : 接收一个日期参数,判断请求日期是否早于指定日期 BetweenRoutePredicateFactory : 接收两个日期参数,判断请求日期是否在指定时间段内-After=2019-12-31T23:59:59.789+08:00[Asia/Shanghai]l * 基于远程地址的断言工厂 **RemoteAddrRoutePredicateFactory** : *接收一个 IP 地址段,判断请求主机地址是否在地址段中-RemoteAddr=192.168.1.1/24l * 基于 **Cookie** 的断言工厂 *CookieRoutePredicateFactory :接收两个参数, cookie 名字和一个正则表达式。 判断请求cookie 是否具有给定名称且值与正则表达式匹配。-Cookie=chocolate, ch.l * 基于 **Header** 的断言工厂 *HeaderRoutePredicateFactory :接收两个参数,标题名称和正则表达式。 判断请求 Header 是否具有给定名称且值与正则表达式匹配。 key value-Header=X-Request-Id, \d+l * 基于 **Host** 的断言工厂 *HostRoutePredicateFactory :接收一个参数,主机名模式。判断请求的 Host 是否满足匹配规则。-Host=**.testhost.orgl * 基于 **Method** 请求方法的断言工厂 *MethodRoutePredicateFactory :接收一个参数,判断请求类型是否跟指定的类型匹配。-Method=GETl * 基于 **Path** 请求路径的断言工厂 * PathRoutePredicateFactory :接收一个参数,判断请求的 URI 部分是否满足路径规则。-Path=/foo/{segment} 基于 Query 请求参数的断言工厂QueryRoutePredicateFactory :接收两个参数,请求 param 和正则表达式, 判断请求参数是否具有给定名称且值与正则表达式匹配。-Query=baz, ba.l * 基于路由权重的断言工厂 *WeightRoutePredicateFactory :接收一个 [ 组名 , 权重 ], 然后对于同一个组内的路由按照权重转发routes:-id: weight_route1 uri: host1 predicates:-Path=/product/**-Weight=group3, 1-id: weight_route2 uri: host2 predicates:-Path=/product/**-Weight= group3, 9
过滤器的使用
(1)引入依赖
com.alibaba fastjson 1.2.83
(2)创建一个实体类

@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();
- //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)){//redis
- return chain.filter(exchange);//放行
- }
- //3.返回一个json数据。
- //3.1设置状态码
- response.setStatusCode(HttpStatus.UNAUTHORIZED);
-
- //3.2封装返回数据
- Map
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;
- }
-
-
- }
(4)设置放行的路径

