- 配置完sentinel后,业务服务启动不了了?(大部分都是配置错了)
基于业务对sentinel限流异常进行自定义处理,例如:
package com.jt.provider.controller;
import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
/**Sentinel中,默认的限流异常处理接口类型为BlockExceptionHandler,假如我们要自己定义
其异常处理规则,可定义类实现此接口,然后进行异常处理即可。*/
@Component
public class SentinelBlockExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request,HttpServletResponse response, BlockException e) throws Exception {
//设置响应数据编码
response.setCharacterEncoding(“utf-8”);
//告诉浏览器向它响应的内容类型,以及编码方式
response.setContentType(“text/html;charset=utf-8”);
response.setStatus(429);
PrintWriter out = response.getWriter();
out.print(“
请求被限流了
”);out.flush();
out.close();
}
}
-
总结课上知识点.
-
了解常用限流算法.
-
自己完成Sentinel服务降级,热点规则设计,系统规则设置,授权规则设置(必须完成).
-
预习spring cloud gateway网关。
-
基于spring mvc 拦截器对系统中指定资源进行时间访问限制?
第一步:拦截器原理分析(回顾spring mvc中的拦截器),例如:
第二步:自定义拦截器,例如:
package com.jt.provider.interceptor;
public class TimeInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println(“preHandle”);
//1.获取当前时间
LocalTime now = LocalTime.now();//LocalTime为jdk8中的一个获取当前时间的api
//2.获取当前的小时并进行逻辑判断
int hour = now.getHour();//8:10~8
System.out.println(“hour=”+hour);
if(hour<9||hour>18){
throw new RuntimeException(“请在9~18时间范围内访问”);//return false
}
return true;//false请求到此结束,true表示放行,会去执行后续的拦截器或controller对象
}
}
第三步:配置拦截器,例如:
package com.jt;
@Configuration
public class SpringWebConfig implements WebMvcConfigurer {
/**
-
注册拦截器(添加到spring容器),并指定拦截规则
-
@param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TimeInterceptor())
.addPathPatterns(“/provider/sentinel01”);
}
}
第四步:打开浏览器,对/provider/sentinel01路径进行访问,对访问结果进行访问。
===============================================================================
-
Sentinel降级(熔断)入门实现(出现不稳当的系统服务时,暂停对此服务的访问)
-
Sentinel实现热点参数限流(热点视频,文章,…)
-
Sentinel系统规则配置(例如cpu使用率,QPS,…),
-
Sentinel授权规则配置(黑白名单,黑白设计由业务决定)
-
如何理解熔断?
-
如何自定义熔断异常处理规则?(实现BlockExceptionHandler接口)
-
如何理解热点参数?(频繁访问的数据,系统底层如何判定哪些数据是频繁访问-lru)
-
系统规则是全局规则吗? (是)
-
授权规则需要我们自己写请求解析类吗?(需要,实现RequestOriginParser接口)
-
请求参数单词错误。
-
…
-
总结课上知识点。
-
了解Lru算法解决了什么问题?
-
总结几个Sentinel中用到设计模式?
-
预习API网关Gateway限流实现(07-网关应用实践)。
============================================================================
-
API 网关(Gateway)诞生背景
-
市场主流微服务网关(Spring Cloud Gateway,zuul,…)
-
API Gateway实现服务的保护和转发(重点)
-
API Gateway层面的负载均衡实现(重点,lb://sca-provider)
-
API Gateway请求处理原理分析(重点:官方图,了解关键代码,执行过程)
-
API Gateway中常用谓词(predicate)对象及实践。
-
API Gateway中过滤器(Filter)的类型及实践。
-
API Gateway中基于sentinel实现服务限流(API,路由id)。
-
API Gateway中基于自定义限流结果的处理(GatewayCallbackManager)。
-
为什么要使用api网关?(服务保护,统一url访问,统一身份认证,统一跨域设计,。。。)
-
网关入门实践的步骤? (依赖,配置,启动,服务访问)
-
网关项目中的负载均衡是如何实现?(底层基于Ribbon实现,可以在RibbonLoadBalancerClient中加断点分析)
-
说说SpringCloud gateway处理请求的基本流程?(官方,断点)
-
网关中的谓词对象类型?(GatewayPredicate)
-
网关中的谓词对象是如何创建的?(谓词工厂)
-
你在网关中配置过哪些常用谓词?(Path,Method,Before,Query,Header,…)
-
网关中的过滤器是如何分类的?(GlobalFilter,GatewayFilter:需要手动配置)
-
我们是否可以自定义谓词,过滤器对象?(可以,参考官方默认的定义)
-
网关层面如何基于sentinel实现限流?(有关sentinel的两个依赖,配置,JVM参数)
-
网关层面的限流类型有哪些?(路由id,API分组)
-
我们是否可以对限流结果进行自定义处理?(可以,了解)
- 配置文件格式不正确,例如
- 服务访问被拒绝,例如
- 服务注册失败(nacos没启动),例如:
- 503 异常(找不到可用的服务)
-
总结课上知识点
-
练习基于Gateway实现负载均衡方式的配置。
-
练习常用谓词,过滤器以及sentinel限流设计。
-
将路由配置写到配置中心进行实践?(自己动手丰衣足食)
第一步:在sca-gateway项目中添加配置依赖,例如:
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
第二步:修改application.yml配置文件名称为bootstrap.yml,并添加配置中心配置。
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yml
第三步:在nacos的public命名空间中创建sca-gateway.yml配置,内容如下:
说明,此配置添加后,可以将bootstrap.yml中网关部分的配置注释掉。
第四步:启动nacos,sentinel,provider,gateway服务,然后进行访问测试。
- 微服务架构下ajax请求响应处理实践。
第一步:业务描述(通过sca-ui工程向网关工程发送ajax请求,并进行响应处理)
第二步:创建sca-ui工程,例如:
第二步:在sca-ui工程中添加spring-boot-starter-web依赖。
org.springframework.boot
spring-boot-starter-web
第三步:在sca-ui工程中启动类,例如:
package com.jt;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoUIApplication {
public static void main(String[] args) {
SpringApplication.run(DemoUIApplication.class, args);
}
}
第四步:在sca-ui工程创建static目录,在此目录下添加js文件,html文件,例如:
其中,index.html内容如下:
The Index Page
Buy
第四步:在sca-gateway的配置文件或配置中心中添加跨域配置,例如:
spring:
cloud:
gateway:
globalcors: #跨域配置
cors-configurations:
‘[/**]’:
allowedOrigins: “*”
allowedMethods: “*”
第五步:按项目架构设计启动服务,进行测试。
http://localhost:8080/index.html
=============================================================================
-
单点登录系统诞生的背景。
-
Java中单点登录系统解决方案。
-
单点登录系统(SSO)中的服务划分及关系设计。
-
单点登录系统中父工程的创建及初始化。
-
系统基础服务(sso-system)工程的创建及基本业务实现。
-
为什么要做单点登录设计?(业务简化,代码复用,不需要每个服务都登录一次)
-
你知道哪些SSO系统解决方案?(基于用户登录状态信息的存储进行方案设计)
-
单点登录系统中你的服务是如何设计的,工程结构是怎样的?
-
项目中使用的连接池什么?(HikariCP)
-
Java中连接池设计需要遵循的数据源规范是谁?(javax.sql.DataSource)
-
连接池这块你能想到的设计模式有哪些?(单例,享元,桥接,slf4j门面)
-
基于idea的为类自动生成序列化id?
- 如何将链接数据库的信息写到配置中心?
- @Autowired注解描述的Mapper对象有红色波浪线,但运行没有错误,如何去除红色波浪线。
- idea中如何在Database窗口打开要访问的数据库,例如
- MySql指令不可用,例如:
- 项目启用异常,提示有多个@SpringBootConfiguration注解描述的类,例如:
- 连接数据库的url中时区定义有问题,例如:
- NullPointerExeption 异常分析?
- 数据库依赖问题,例如:
-
总结课上内容
-
完成单点登录系统中的基础服务的设计和实现
===============================================================================
-
定义数据访问逻辑对象(UserMapper)
-
定义用户信息远程调用Feign接口(RemoteUserService~基于此接口调用sso-system服务中的用户信息)
-
基于Security规范定义用户业务逻辑服务对象(UserDetailsServiceImpl~调用RemoteUserService获取和封装用户信息)
-
定义用户认证基本配置类(SecurityConfig~配置密码加密对象,认证规则,以及登录成功或失败的处理方案)
-
实现自定义登录逻辑测试(校验登录正确账号和错误账户下服务端的响应结果)
-
熟悉SpringSecurity的认证流程?(Client->Filters->AuthenticationManager–>UserDetailService->…)
-
为什么定义RemoteUserService 接口(Feign)?(基于此接口调用远程sso-system服务)
-
sso-auth服务中用户业务数据的获取在哪里?(客户端提交的用户名,sso-system服务提供的数据库数据)
-
为什么要构建SecurityConfig对象?(配置加密算法,认证规则)
-
为什么要让SecurityConfig类要继承WebSecurityConfigurerAdapter类型?(重写默认的认证规则)
-
认证过程中使用的密码加密对象是谁?(BCryptPasswordEncoder,不可逆加密对象)
-
用户登录时,需要从数据库查询哪些信息?(用户信息以及用户的权限信息)
-
如何基于用户id查询用户权限,你有什么方案?(3种)
- 单体架构中的用户的状态的存储是如何实现的?(了解,默认是存储到了tomcat的session对象中)
- 没有PasswordEncoder对象,例如:
- 远程调用服务404异常,例如:
- 远程调用服务没启动或服务名不正确,例如
- 基于postman登录测试时404异常,例如:
- 服务名的定义和使用不规范,例如:
- Feign接口依赖注入异常,例如:
- NullPointerException,例如
- Maven Helper 插件安装及应用,例如
- 基于idea的http client工具测试登录,例如
- 基于Postman工具测试登录,例如:
-
总结课上知识点
-
预习并尝试完成统一认证服务中TokenConfig,Oauth2Config类的定义
-
预习并尝试完成资源服务工程(sso-resource)设计?
================================================================================
-
认证服务器(sso-auth)中Token设计(UUID令牌,JWT令牌)
-
认证服务器(sso-auth)中Oauth2规范基本配置(认证入口,为谁认证,由谁认证,认证后颁发什么令牌)
-
基于Postman进行认证测试?(请求方式,请求url,认证参数)
-
资源服务器(sso-resource)核心业务分析及认证,授权规则设计及实现(匿名,认证,授权)
-
JWT是什么?(是JSON WEB TOKEN这几个单词的缩写,描述的是web应用的一种令牌格式)
-
JWT有几部分构成?(头:令牌类型,签名算法,负载:允许包含用户登录状态 ,签名:防止令牌被篡改)
-
为什么要采用JWT令牌?(可以存储用户登录状态信息,避免访问资源时从数据库查询认证信息)
-
基于Oauth2协议的认证服务器默认的令牌生成策略是什么?(UUID.randomUUID())
-
认证服务器中常见令牌相关设计存储方案有哪些?(Mysql,Redis,Jwt)
-
认证服务器对用户进行认证时,客户端提交了哪些关键信息?(username,password,client_id,grant_type,client_secret)
-
认证服务器完成认证操作后,服务端返回哪些信息?(访问令牌,刷新令牌,令牌类型,作用域,编号)
-
认证服务器中完成认证业务的关键对象有哪些?(Filter,AutenticationManager,UserDetailService,.)
-
资源服务器如何设计的认证,授权规则?(三个维度:匿名,登录,授权)
-
访问令牌与刷新令牌有什么不一样?(客户端是要携带访问令牌访问资源的,刷新令牌是为了再次生成访问令牌)
-
访问令牌,刷新令牌有有效时长吗?(刷新令牌有效时长一般要大于访问令牌有效时长)
- 客户端传参不匹配,例如:
- AuthenticationManager对象没有配置(SecurityConfig),例如:
- 响应的令牌不正确,例如:
- 400异常,例如
- 请求方式不正确,例如
- 访问地址错误,例如:
-
总结课上知识点及常见问题
-
完成单点登录系统的认证服务器以及资源服务器的设计和实现
=================================================================================
-
SSO系统中网关服务器(sso-gateway)实现路由转发,跨域设计,负载均衡,限流。
-
SSO系统中UI工程中页面设计(Bootstrap+VUE+axios)及请求响应代码分析(200,401,403)。
-
SSO系统中用户访问资源时,记录用户行为到数据库?
-
网关服务器在哪里做了负载均衡(lb://)?
-
为什么网关层面要做跨域设计?(Ajax技术不支持跨域请求,将所有服务的跨域共性提取到网关层面)
-
UI工程中用户端如何提交ajax请求的?(axios,底层ajax对象为XMLHttpRequest)
-
System工程中如何记录用户行为日志的?(通过异步方式将日志写到数据库,@EnableAsync,@Async)
-
系统工程中的用户行为日志来自哪里?(资源服务器,此服务器记录用户访问资源的一些信息)
-
资源服务器通过什么样的方式获取用户行为信息?(AOP)
-
400异常,请求参数不合法(参数个数,类型,格式)。
-
401异常,认证失败?(提交的数据不正确)
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
2021年Java中高级面试必备知识点总结
在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。
本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。
目录:
(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程)
部分内容:
对于每一个做技术的来说,学习是不能停止的,小编把2019年到目前为止Java的核心知识提炼出来了,无论你现在是处于什么阶段,如你所见,这份文档的内容无论是对于你找面试工作还是提升技术广度深度都是完美的。
不想被后浪淘汰的话,赶紧搞起来吧,高清完整版一共是888页,需要的话可以点赞+关注
程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-cMmrUClq-1711278726588)]
[外链图片转存中…(img-fYbUO3pF-1711278726589)]
[外链图片转存中…(img-RJbEKiJR-1711278726589)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-k4ae9PDN-1711278726589)]
2021年Java中高级面试必备知识点总结
在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。
本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。
目录:
[外链图片转存中…(img-LnlFbQcW-1711278726589)]
(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程)
[外链图片转存中…(img-nHBi50Ym-1711278726590)]
部分内容:
[外链图片转存中…(img-r24H3ukf-1711278726590)]
[外链图片转存中…(img-QlwpvY7t-1711278726590)]
[外链图片转存中…(img-Ou708xDq-1711278726590)]
对于每一个做技术的来说,学习是不能停止的,小编把2019年到目前为止Java的核心知识提炼出来了,无论你现在是处于什么阶段,如你所见,这份文档的内容无论是对于你找面试工作还是提升技术广度深度都是完美的。
不想被后浪淘汰的话,赶紧搞起来吧,高清完整版一共是888页,需要的话可以点赞+关注