springcloud

亡梦爱人 提交于 2021-01-17 21:06:19

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等

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!