1、创建数据库
在实际开发过程中,如果使用
Nacos
的话,为了确保高可用,我们一般都
会对其进行集群的部署。
Nacos
规定集群中
Nacos
节点的数量需要
大于等
于
3
个
;同时,单机模式下
Nacos
的数据默认保存在其内嵌数据库中
deby
,
不方便观察数据存储的基本情况。而且如果集群中启动多个默认配置下的
Nacos
节点,数据存储是存在一致性问题的。为了解决这个问题,
Nacos
采用了集中式存储的方式来支持集群化部署,目前只支持
MySQL
的存储;
此外,我们还需要借助
Nginx
实现负载均衡。这一过程的部署架构图如下所
示:
创建成功后
1.1. 指定使用mysql作为数据存储
1.2 配置集群文件
注意:在连接数据库之前,要先测试数据库是否可以远程连接,如果不能,则需要为数据库配置远程连接。
1.3 停止nacos并复制三份
然后找到 bin/startup.cmd 将三个nacos全部启动
启动成功后
1.4 搭建nginx代理上面三个nacos
注意:这里开启的nginx是windows版本
打开 conf/nginx.conf
在任务管理中的详细信息找到如下图所示,表示成功
开启成功后,登录nacos。账号和密码默认都是nacos,出现下图的情况,就证明集群模式创建成功了
1.5 微服务注册到nacos集群上
2. gateway网关
2.1 网关的使用
(1)创建一个gateway微服务模块
(2)
加入相关的依赖
<!--只需要添加该依赖,不要使用spring-boot-starter- web依赖。 3 因为gateway内置了服务器netty.而web的jar内置 tomcat 4 --> <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>
(3)配置文件
server :port : 7000spring :application :name : springcloud-gateway# 路由转发 List<RouteDefinition> routescloud :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); } }
2.2 gateway网关从注册中心拉取服务型
(1
)引入依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba- nacos-discovery</artifactId></dependency>
(2
)配置文件中指定注册中心的地址
如果在访问订单微服务也就是 lb://springcloud-order 时出现 503 的情况 ,可以将lb://springcloud-order 装换为http://127.0.0.1:(订单微服务的端口号)
2.3 gateway自动路由
修改配置文件
将上面“配置文件中指定注册中心的地址”图片中的代码全部注释(后面还要用)然后写下面的代码
cloud: gateway: discovery: locator: enabled: true nacos: server-addr: localhost:81
访问时
:
http://
网关的
ip:
网关的
port/
微服务名称
/
资源路径
2.4 网关的跨域问题
(1)配置类进行跨域
(2)注解进行网关跨域
cloud: gateway: globalcors: cors-configurations: '[/**]': allowedOrigins: "*" allowedMethods: - GET - POST - DELETE - PUT - OPTION
3 Gateway断言
3.1了解断言
在 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
如果上面内置的断言不能满足你的需求:可以自定义断言。
注意
:
名称必须为
XXXRoutePredicateFactory
并且继承
AbstractRoutePredicateFactory
使用xxx=
4、过滤器
作用
:
认证校验 黑白名单
敏感词
过滤器的使用
(1)引入依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.83</version> </dependency>
(2)创建一个实体类
@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; } }
(3)过滤器的相关代码
@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)){//redis
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;
}
}
(4)设置放行的路径
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。