1. Auth2认证流程
用户 授权 ,颁发服务令牌,服务拿着令牌去请求资源
2. 令牌分为哪几类?
答: 分为 普通令牌和 JWT令牌
3. 向客户端返回的令牌 包括 哪几部分?
答: token(短令牌),刷新令牌,jwt令牌
4. 如何生成JWT令牌?
答: 使用 JwtHelper生成令牌,根据(内容,私钥)
//创建jwt令牌
@Test
public void testCreateJwt(){
//密钥库文件
String keystore = "xc.keystore";
//密钥库的密码
String keystore_password = "xuechengkeystore";
//密钥库文件路径
ClassPathResource classPathResource = new ClassPathResource(keystore);
//密钥别名
String alias = "xckey";
//密钥的访问密码
String key_password = "xuecheng";
//密钥工厂
KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(classPathResource,keystore_password.toCharArray());
//密钥对(公钥和私钥)
KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias, key_password.toCharArray());
//获取私钥
RSAPrivateKey aPrivate = (RSAPrivateKey) keyPair.getPrivate();
//jwt令牌的内容
Map<String,String> body = new HashMap<>();
body.put("name","itcast");
String bodyString = JSON.toJSONString(body);
//生成jwt令牌
Jwt jwt = JwtHelper.encode(bodyString, new RsaSigner(aPrivate));
//生成jwt令牌编码
String encoded = jwt.getEncoded();
System.out.println(encoded);
}
5. 网关的核心是什么?
答: 是过滤器 ZullFilter
6. 网关需要干什么?
答:1)检查(用户身份校验)
2)代理
7. springSecuriety中当使用 用户名密码授权模式时,我们需要配置什么?
答: 需要重写 UserDetaiService 中 loadUserByName()方法,springSecuriety 会去调用该方法
8. springSecuriety中 如何 给 当前用户设置权限?
答: 在 new User(springSecuriety)时,调用
//参数3为权限
public User(String username, String password, Collection<? extends GrantedAuthority> authorities) {
this(username, password, true, true, true, true, authorities);
}
例子:
//从数据库中查出该用户权限
List<XcMenu> permissions = userext.getPermissions();
if(permissions == null){
permissions = new ArrayList<>();
}
List<String> user_permission = new ArrayList<>();
//item.getCode 是 得到权限的Code 是 XcMenu 对象中的属性
permissions.forEach(item-> user_permission.add(item.getCode()));
String user_permission_string = StringUtils.join(user_permission.toArray(), ",");
UserJwt userDetails = new UserJwt(username,
password,
AuthorityUtils.commaSeparatedStringToAuthorityList(user_permission_string));
public class XcMenu {
@Id
@GeneratedValue(generator = "jpa-uuid")
@Column(length = 32)
private String id;
private String code;
@Column(name="p_code")
private String pCode;
@Column(name="p_id")
private String pId;
@Column(name="menu_name")
private String menuName;
private String url;
@Column(name="is_menu")
private String isMenu;
private Integer level;
private Integer sort;
private String status;
private String icon;
@Column(name="create_time")
private Date createTime;
@Column(name="update_time")
private Date updateTime;
}
代码位置: ucenter-auther中 UserDetail 中 loadUserByUsername
8. 微服务中如何实现 高可用 ?
答:将服务集群部署 和 通过 注册中心 对服务的管理 实现高可用。
9. 要实现高可用需要哪些东西?
10. 页面 向微服务 发送请求,路径该怎样写,也写 服务名+url吗?
答: 不是,例如: 规定/api开头的都是微服务请求,然后根据第二个参数代理到不同的应用上
server:
port: 50201
servlet:
context-path: /api
spring:
application:
name: xc-govern-gateway
redis:
host: ${REDIS_HOST:127.0.0.1}
port: ${REDIS_PORT:6379}
timeout: 5000 #连接超时 毫秒
jedis:
pool:
maxActive: 3
maxIdle: 3
minIdle: 1
maxWait: -1 #连接池最大等行时间 -1没有限制
zuul:
routes:
manage-course:
path: /course/**
serviceId: xc-service-manage-course #微服务名称,网关会从eureka中获取该服务名称下的服务实例的地址
# 例子:将请求转发到http://localhost:31200/course
#url: http://www.baidu.com #也可指定url,此url也可以是外网地址\
strip-prefix: false #true:代理转发时去掉前缀,false:代理转发时不去掉前缀
sensitiveHeaders: #默认zuul会屏蔽cookie,cookie不会传到下游服务,这里设置为空则取消默认的黑名单,如果设置了具体的头信息则不会传到下游服务
# ignoredHeaders: 默认为空表示不过虑任何头
xc-service-learning: #路由名称,名称任意,保持所有路由名称唯一
path: /learning/**
serviceId: xc-service-learning #指定服务id,从Eureka中找到服务的ip和端口
strip-prefix: false
sensitiveHeaders:
manage-cms:
path: /cms/**
serviceId: xc-service-manage-cms
strip-prefix: false
sensitiveHeaders:
manage-sys:
path: /sys/**
serviceId: xc-service-manage-cms
strip-prefix: false
sensitiveHeaders:
service-ucenter:
path: /ucenter/**
serviceId: xc-service-ucenter
sensitiveHeaders:
strip-prefix: false
xc-service-manage-order:
path: /order/**
serviceId: xc-service-manage-order
sensitiveHeaders:
strip-prefix: false
11. 页面请求到 微服务,是如何实现 负载均衡 和 高可用的?
答: 是 通过网关中 将 请求 代理到 服务名+uti,外加 feign
12. springcloud中熔断机制的使用?
答:fein中集成了 Hystrix,不需要再添加依赖包
注意:fallback后面的类中要实现 feinclient 注解的类的接口,也就是 feinclient类的实现类
1.
fein集成了hystrix,所以可以直接使用fallback来指定访问失败时返回的方法。
并且fallback后填写的类需要实现被填写的接口。即MyServiceIErrorService要实现MyServiceIService
@Component
@FeignClient(value="myServiceI",fallback=MyServiceIErrorService.class)
public interface MyServiceIService {
@ResponseBody
@RequestMapping(value="/myServiceI/Api/getInfo")
public String getInfo();
}
2.添加MyServiceIErrorService.java
实现MyServiceIService,这样在访问MyServiceIService的getInfo方法失败后就会返回MyServiceIErrorService的getInfo方法
package com.my.customerII.api;
import org.springframework.stereotype.Component;
@Component
public class MyServiceIErrorService implements MyServiceIService{
public String getInfo() {
return "The Service is down!";
}
}
13. 统一配置管理中,所有的文件都保存在 git 仓库中吗?
答:是的
14. 统一配置管理中,配置文件名有要求吗?
答:有,是 应用名-环境名.yml或.propertis
15 在实现统一配置管理情况下,config客户端是否需要配置?
答: 是,需要在 bootstrap.yml文件 做配置,配置应用名,环境名
config client 使用
这里以订单服务为例
1、引入config client依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
2、配置文件
这里需要将配置文件application.yml改为bootstrap.yml
因为spring boot 默认执行的配置文件application.yml项目启动之后,就会直接加载。
而bootstrap.yml在spring boot中会优先加载,且bootstrap中的属性不会被覆盖。
spring:
application:
name: order
cloud:
config:
discovery:
enabled: true
service-id: CONFIG
profile: dev
解释:
enabled:设置true,开启config。
service-id : config server 服务的服务名
profile:环境dev,test等
来源:oschina
链接:https://my.oschina.net/u/3631797/blog/3125001