# srpingcloud_demo **Repository Path**: hanxiaozhang2018/srpingcloud_demo ## Basic Information - **Project Name**: srpingcloud_demo - **Description**: srpingcloud_demo - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2021-04-16 - **Last Updated**: 2022-06-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # srpingcloud_demo #### 介绍 srpingcloud项目 #### 软件架构 srpingcloud项目组件的使用方法 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx ## Spring Cloud组件超时问题: ### RestTemplate的超时 ``` @Bean @LoadBalanced public RestTemplate restTemplate(){ SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); requestFactory.setReadTimeout(15000);//读取超时 requestFactory.setConnectTimeout(5000);//连接超时 return new RestTemplate(requestFactory); } ``` ### Ribbon的超时 1) 全局配置 ``` ribbon: ReadTime: 1000 # 单位是ms ConnectTimeout: 1000 # 单位是ms ``` 2) 局部配置 ``` service-id: # 一般和Eureka Server上注册的服务名称一致,即与spring.application.name一致 ribbon: ReadTime: 1000 # 单位是ms ConnectTimeout: 1000 # 单位是ms ``` ### Feign的超时: ``` feign: client: config: # 如果写成default,则表示通用配置 feignName: connectTimeout: 5000 # 单位是ms readTimeout: 5000 # 单位是ms ``` ### Hystrix的超时: ``` hystrix: command: : execution: timeout: enable: true isolation: thread: timeoutMilliseconds: 1000 ``` 其中可在Hystrix Dashboard上看到,若设为default,则表示对所有Hystrix Command统一设置 ### Zuul的超时: #### 两种情况:使用URL配置的路由和使用Ribbon 1) **使用URL配置的路由:** 它是基于httpclient来发送请求,可以直接设置socket的连接时间。 ``` zuul.host.max-per-route-connections=500 zuul.host.socket-timeout-millis=3000 zuul.host.connect-timeout-millis=500 ``` 2) 使用Ribbon 可以配置ribbon超时时间,也可以配置hystrix超时时间,两者取配置最小者 https://www.jianshu.com/p/eadbc3188a98 ## Spring Cloud组件重试问题: https://www.cnblogs.com/zhangjianbin/p/7228606.html ## 应用安全: 认证(Authentication)和授权(Authorization),即你是谁,以及你能做什么。 在单体应用中,开发者可以通过简单的拦截器以及会话(Session)机制对用户的访问进行控制和记录。 在分布式系统中,由于业务逻辑封装各个微服务中,每个微服务都系统需要对用户的行为进行认证和许可, 于是就产生了两种可能方式: 第一种:通过一个中心化的权限管理系统,对用户的身份和权限进行统一的管理,可以做到一次授权,多次多点使用, 但是这个独立的安全微服务需要聚合各个微服务中权限控制逻辑,当添加一个新的基于不同业务逻辑实现的微服务就可能需要 在安全微服务中添加新的实现。 第二种:将安全控制分散到各个微服务中,有各个微服务根据自身的业务对用户的访问进行管理和控制。 ## JWT(Json Web Token) ### 概念: 它是一个开发的标准,通过紧凑或自包含的方式,定义了用于在各方之间发送的安全JSON对象。它是访问令牌和刷新令牌的载体 ### 组成: 它由三部分组成,每部分通过.分割开,分别是: Header(头部)、Payload(有效负荷)、Signature(签名) 1) **Header:** 组成: typ(类型):一般为JWT alg(加密算法):通常是HMAC SHA256 或者 RSA **Tips:** 这部分Json会由Base64Url编码,构成JWT的第一部分。 2) **Payload:** 作用:用来携带有效信息的载体,主要是关于用户实体和附加元数据的声明 组成: Registered claims(注册声明):这是一组预订的声明,但并不强制要求。它提供了一套有用的、能共同使用的声明。主要有iss(JWT签发者)、exp(JWT过期时间)、 sub(JWT面向的用户)、aud(结束JWT的一方)等。 Public claims(公开声明):公开声明中可以添加任何信息,一般是用户信息或者业务拓展信息等。 Private claims(私有声明): 由JWT提供者和消费者共同定义的声明,既不属于注册者也不属于公开声明。 **Tips:** 不建议在PayLoad中添加任何敏感信息,因为Base64是对称解密 3) **Signature:* 创建签名,需要编码后的头部、编码后的Payload、一个密钥,最后通过在头部alg键值定义的加密算法加密生成签名。 ## 整体的异常处理思路 ### 一、服务提供者出现异常: #### 思路一: 提供者不对异常做处理(特殊异常也可以捕获处理),消费者处理服务者的异常,消费者通过Hystrix熔断器来处理。 ##### 实现: (1) 重写Feign的错误解码器decode()方法(ErrorDecoder.decode(String methodKey, Response response)): **先导知识:** + ErrorDecoder.decode(String methodKey, Response response):实现此方法,对Response#status()在不在2xx范围内HTTP进行解码 + decode()方法response的body(响应正文)如下: ```json {"timestamp":1595296761081,"status":500,"error":"Internal Server Error", "exception":"com.hanxiaozhang.exception.InternalServerException", "message":"系统繁忙,请稍后重试","path":"/order/1"} ``` **处理:** 使用"exception"对应类全限定名反射出该异常类,实例化该异常对象;然后返回该异常对象(详见:FeignClientErrorDecoder.java)。 (2) 在Hystrix的FallbackFactory中,将异常转换成Result类(对外统一响应格式),返回给用户(详见:OrderFeignClientFallbackFactory.java) #### 思路二: 使用全局异常处理,详见GlobalExceptionHandler.java。启用时,在Controller上加@EnableGlobalException自定义注解 ### 二、服务消费者出现异常: 使用全局异常处理,详见GlobalExceptionHandler.java。启用时,在Controller上加@EnableGlobalException自定义注解 ### 三、Zuul网关出现异常: #### 两种方式 1.自定义error错误页面(ErrorHandlerController.java) 2.禁用zuul默认的异常处理filter(SendErrorFilter),自定义ErrorFilter ### 四、自定义业务异常系统: 参考:https://blog.csdn.net/aiyaya_/article/details/78989226