前期准备工作完成后,现在开始搭建项目,今天主要完成项目的搭建和基本功能的调试。
网关
- 网关服务认证转发配置
- 监控数据源Druid的集成配置
工程结构
- 全局过滤器
@Component
@ log4j 2
public class Stock Request GlobalFilter implements GlobalFilter, Ordered {
/**
* 通过filter来自定义配置转发信息
* @param exchange
* @param chain
* @return
*/ @Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String authentication = exchange.getRequest().getHeaders().getFirst("Authorization");
if(!StringUtil.isNullOrEmpty(authentication)){
log.info("enter stockRequestGlobalFilter filter method: " + authentication);
exchange.getRequest().mutate().header("Authorization",authentication);
}
return chain.filter(exchange.mutate().build());
}
@Override
public int getOrder() {
return -1000;
}
}
网关配置:
server:
port: 10680
spring:
application:
name: stock-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1 : 8848
service: stock-gateway
gateway:
discovery:
# 允许通过服务名称进行路由转发访问,
locator:
enabled: true
# 路由配置
routes:
- id: stock-user
uri: lb://stock-user
predicates:
- Path=/user/**
- id: trade-auth
uri: lb://trade-auth
predicates:
# - Method=GET,POST 不要开启此项
- Path=/oauth/**
logging:
level:
root : info
经过实践摸索,如果网关只是转发,按照我们OAUTH2的设计方案, Spring Cloud Gateway 可以不用集成Spring Security。网关的职责就是接收客户端的请求并进行转发, 所以 鉴权 可以不用放置在网关, 各 微服务 直接作为资源服务进行认证,也可以避免微服务直接对外暴露产生的安全问题, 在这里学习如何通过Gateway转发请求, 实现OAuth2的认证。
用户服务
- Druid集成配置
server:
port: 10681
spring:
application:
name: stock-user
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config :
server-addr: 127.0.0.1:8848
sentinel :
transport:
# Sentinel管理后台的连接配置
dashboard: 127.0.0.1:8858
datasource:
# 用户的降级规则配置:
user-degrade:
nacos:
server-addr: 127.0.0.1:8848
dataId: sentinel-user-degrade
groupId: DEFAULT_GROUP
data-type: json
rule-type: degrade
#用户限流的规则配置:
user-flow:
nacos:
server-addr: 127.0.0.1:8848
dataId: sentinel-user-flow
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
# 数据源配置, 采用Druid
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.my SQL .cj. jdbc .Driver
username: root
password: root12349876
url: jdbc:mysql://106.14.250.251:3306/trade_stock?useUnicode=true&characterEncoding=UTF-8&useSSL=false
druid:
# 连接池的配置信息
# 初始化大小,最小,最大
initial-size: 5
min-idle: 5
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
# 通过connectProperties属性来打开 merge Sql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
# 配置DruidStatFilter
web-stat-filter:
enabled: true
url-pattern: "/*"
exclusions: "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
# 配置DruidStatViewServlet
stat-view-servlet:
url-pattern: "/druid/*"
# IP白名单(没有配置或者为空,则允许所有访问)
allow:
# IP黑名单 (存在共同时,deny优先于allow)
deny:
# 禁用HTML页面上的“Reset All”功能
reset-enable: false
# 登录名
login-username: admin
# 登录密码
login-password: admin123
# 监控后台开关, 开启可通过后台管理查看
enabled: true
## spring security 配置
security:
oauth2:
resource:
loadBalanced: true
token-info-uri:
Client :
client-id: app
client-secret: app
scope: server
access-token-uri: oauth /token
user-authorization-uri:
#mybatis 配置
mybatis -plus:
configuration:
map-underscore-to- camel -case: true
auto-mapping-behavior: full
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations:
- classpath:com/itcast/bulls/stock/user/dao/mapper/*.xml
- classpath:com/itcast/bulls/stock/common/system/dao/mapper/*Mapper.xml
global-config:
# 逻辑删除 配置
db-config:
# 删除前
logic-not-delete-value: 1
# 删除后
logic-delete-value: 0
主要是stat-view-servlet下面配置:
url-pattern是配置监控台的访问地址。
allow是允许哪些IP进行访问。
deny是 IP 黑名单, 优先级高于allow。
reset-enable是复位功能, 谨慎使用。
login-username是登陆了用户名。
login-password是登陆密码。
enabled是监控台的启用开关, 此项一定要开启。
- Druid访问验证
启动服务即可访问, 把用户服务启动, 访问地址:
oauth服务
项目结构
- 启动服务
申请token
新建一个请求, 输入地址: 127.0.0.1:9999/oauth/token
选择认证方式, 填入Client的用户与密码信息,非t_trade_user信息。
填入 grant _type, 认证模式; username和password对应t_trade_user表信息, scope 作用域对应client用户的scope, 不能填错。
采用post和get方式请求都可以, 返回结果可以看到有两部分, 一部分是内置的token信息, 另外一部分就是我们自定义增强的token扩展信息。
- 刷新token
刷新token, 地址不变, 需要传递refresh_token, 这个在申请token时可以拿到, grant_type类型要设置为refresh_token。
刷新成功, 和上面申请的token值发生了变化, access_token已重新生成。
- 网关服务启动后只需要把地址换成网关地址即可。
sentinel
#/dashboard/home 账号密码: sentinel
现在主要配置限流和降级规则,规则配置在nacos
sentinel如果部署到服务器上,本地启动项目时无法实时监控到的。
原因: Sentinel的监控需要双方互发包进行健康校验等实现监控,而阿里云ECS服务器无法ping通主机ip,导致出错
用户注册
公司表,部门表配置好后,用户保存即可成功
接下来完成权限管理功能