🌀 Personal learning use cases. 个人学习用例。
以异构语言为目的的微服务架构,高自由度,可扩展,可伸缩。
使用 Docker 构建服务。本地架构服务器IP:192.168.1.254
,本地开发计算机IP:192.168.1.188
spring | version |
---|---|
boot | 2.0.6.RELEASE |
cloud | Finchley.SR2 |
application | port | describe |
---|---|---|
spring-cloud-eureka | 9010/9011 | 注册中心:安全认证 |
spring-cloud-config | 9020 | 配置中心:配置刷新 |
spring-cloud-zuul | 9030 | API网关:回退、熔断、重试、限流、鉴权 |
spring-boot-admin | 9040 | boot管理:监控、日志、配置 |
spring-cloud-oauth | 9050 | 授权中心:注册、签发、鉴权、撤销 |
spring-cloud-sidecar | -- | 异构客户端代理 |
- username: eureka
- passwod: 123456
- username: admin
- passwod: 123456
- username: guest
- passwod: guest
- 配置刷新:
[POST] /actuator/bus-refresh
("application/json; charset=UTF-8") - web hook:
[POST] /monitor
oauth2.0 + jwt,支持 token 自定义数据,支持 token 撤销机制,支持单用户多终端授权。
- authorization_code模式:通过用户获取 code,进而获取 token
1. [GET] /oauth/authorize?client_id=SampleClientId&response_type=code&redirect_uri=http://callback.com/login
用户同意授权后响应:
浏览器重定向到:http://callback.com/login?code=1E37Xk,接收code,然后后端调用步骤2获取token
2. [POST] /oauth/token?client_id=SampleClientId&client_secret=tgb.258&grant_type=authorization_code&redirect_uri=http://callback.com/login&code=1E37Xk&extend[id]=2222&user_client_type=pc
响应:extend 为自定义数据,数据会包含在token中
user_client_type 为用户终端类型,默认为 default
{
"access_token": "a.b.c",
"token_type": "bearer",
"refresh_token": "d.e.f",
"expires_in": 43199,
"scope": "read",
"userId": "1",
"extend": {
"id": "2222"
},
"user_client_type": "pc",
"jti": "823cdd71-4732-4f9d-b949-a37ceb4488a4"
}
- password模式:直接使用用户获取 token
[POST] /oauth/token?client_id=SampleClientId&client_secret=tgb.258&grant_type=password&scope=read&username=zhangsan&password=tgb.258&extend[id]=2222&user_client_type=pc
响应:extend 为自定义数据,数据会包含在token中
user_client_type 为用户终端类型,默认为 default
{
"access_token": "a.b.c",
"token_type": "bearer",
"refresh_token": "d.e.f",
"expires_in": 43199,
"scope": "read",
"userId": "1",
"extend": {
"id": "2222"
},
"user_client_type": "pc",
"jti": "823cdd71-4732-4f9d-b949-a37ceb4488a4"
}
[POST] /oauth/check_token?token=a.b.c
[POST] /oauth/token?client_id=SampleClientId&client_secret=tgb.258&grant_type=refresh_token&refresh_token=d.e.f
[POST] /oauth/revokeToken?client_id=SampleClientId&client_secret=tgb.258&access_token=a.b.c
[POST] /oauth/revokeTokenAll?client_id=SampleClientId&client_secret=tgb.258&access_token=a.b.c
[GET] /oauth/token_key
[POST] /oauth/signUp?username=lisi&password=yourpass&client_id=SampleClientId&client_secret=tgb.258
[GET] /management/user/
API网关,支持鉴权,断路器机制,回退机制,统一异常处理,接口限流
传递 token 三种方式
- 请求时添加Authorization header
Authorization : Bearer xxxxx
- 请求地址添加参数access_token
/api/a?access_token=xxxxx
- cookie方式 添加access_token
access_token=xxxxx
加签可以使用阿里云API网关的加签方式,做了初步的解析验证!
├─ spring-docker-compose
│ ├─ compose - 容器构建编排配置
│ ├─ conf - 容器配置
│ ├─ extensions - 依赖
│ ├─ logs - 日志
│ ├─ sh - 脚本
│ ├─ volumes - 数据卷
│ ├─ .dockerignore
│ ├─ .gitignore
│ ├─ Dockerfile
│ └─ sources.list
cd ./cloud-docker-compose/compose
cp docker-compose-dev.env .env
docker-compose -f docker-compose-dev.yml up -d
[root@localhost ~]# docker ps --format "table {{.Command}}\t{{.Ports}}\t{{.Names}}"
COMMAND PORTS NAMES
"docker-entrypoint.s…" 0.0.0.0:9051->6379/tcp cloud_oauth_redis
"/bin/bash" 0.0.0.0:9011->9011/tcp cloud_eureka_1
"/bin/bash" 0.0.0.0:9030->9030/tcp cloud_zuul
"/bin/bash" 0.0.0.0:9010->9010/tcp cloud_eureka
"/bin/bash" 0.0.0.0:9020->9020/tcp cloud_config
"php -S 0.0.0.0:80" 0.0.0.0:9032->80/tcp cloud_zuul_phpredisadmin
"docker-entrypoint.s…" 4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp rabbitmq
"php -S 0.0.0.0:80" 0.0.0.0:9052->80/tcp cloud_oauth_phpredisadmin
"docker-entrypoint.s…" 0.0.0.0:9031->6379/tcp cloud_zuul_redis
"/bin/bash" 0.0.0.0:9040->9040/tcp cloud_admin
"docker-entrypoint.s…" 33060/tcp, 0.0.0.0:9053->3306/tcp cloud_oauth_mysql
"/bin/bash" 0.0.0.0:9050->9050/tcp cloud_oauth
cd ./cloud-docker-compose/sh
chmod 0755 *.sh
./xxxx.sh
sh/docker_in.sh
- 进入容器sh/jar_restart.sh
- 重启 jar 包sh/jar_start.sh
- 启动 jar 包sh/jar_stop.sh
- 停止 jar 包
配置仓库:{application}/${spring.application.name}-${spring.cloud.config.profile}.yml