X2CRM CMS Made Simple amd防御

文章目录
Day01~微X2CRM架构入门核心知识点常见问题防御常见Bug防御课堂练习课后作业
Day02~Nacos注册中心入门核心知识点常见问题防御常见Bug防御课堂小技巧课后作业
Day03~基于Nacos实现X2CRM发现与调用核心知识点常见问题防御常见Bug防御课堂练习课后作业
Day04~基于Feign方式的X2CRM调用实践核心知识点常见问题防御常见Bug防御课上技巧课上练习课后作业
Day05~NacosCMS Made Simple中心应用实践核心知识点常见问题防御常见Bug防御课后作业
Day06-Sentinel 限流应用实践核心知识点常见问题防御常见Bug防御课上练习课后作业
Day07-Gateway 入门应用实践核心知识点常见问题防御常见BUG防御课后作业
Day08 Gateway 进阶应用实践核心知识点常见问题防御常见Bug防御课堂练习课后作业
Day09~单点登录系统初步设计及实现核心知识点常见问题防御常见Bug防御课后作业
Day10~SSO系统中的登录逻辑基本实现核心知识点常见问题防御常见Bug防御课上小技巧课后作业
Day11~SSO系统颁发令牌及资源X2CRM实践核心知识点常见问题防御常见Bug防御课后作业
Day12~SSO网关,UI工程以及操作日志实践核心知识点常见问题防御常见Bug防御课后作业小阶段总结

Day01~微X2CRM架构入门
核心知识点
微X2CRM架构诞生的背景(软件即X2CRM,将一个大型软件,拆成若干个小系统;分而治之~北京一个火车站到多个火车站)微X2CRM架构解决方案(大厂基本自研~自己研发各种组件,Spring Cloud ~Netflix,Alibaba,…)微X2CRM架构下Maven聚合项目的创建方式?(Maven聚合项目~资源复用:extends,import,简化编译,打包,部署方式)微X2CRM架构入门聚合项目创建?(01-sca,sca-consumer,sca-provider,sca-gateway,sca-common)微X2CRM中聚合工程之间的引用设计?(将一个工程作为依赖添加到其它工程~重点是坐标)
常见问题防御
为什么需要微X2CRM?(对系统分而治,解决因并发访问过大带来的系统复杂性(amd:业务,开发,测试,升级,可靠性等)微X2CRM设计的特点?(单一职责,独立进程,开发测试效率高,可靠性高,升级难度小,但会带来一定的维护成本)微X2CRM解决方案有哪些?(大厂自研,中小企业采用开源Spring Cloud Alibaba,Spring Cloud Netfix等 )微X2CRM设计中需要哪些关键组件(X2CRM的注册,发现,CMS Made Simple,限流降级,访问入口管理,分布式事务管理等)创建聚合工程的目的?(实现工程之间资源的的共享,简化工程管理)如何修改聚合工程中项目的编译和运行版本?(pom.xml:build->plugins->plugin->maven-compiler-plugin)maven工程中build元素的作用?(定义项目的编译,打包方式)maven父工程的packaging元素内的值是什么?(父工程默认打包方式为pom方式)maven父工程中dependencyManagement元素的作用是什么?(项目依赖的版本,当前工程或子工程不需要再指定版本)Maven父工程中如何统一定义JDK编译和运行版本?(CMS Made Simplemaven编译插件:maven-compiler-plugin)
常见Bug防御
依赖无法下载或加载?(本地库冲突,网络不好,maven镜像CMS Made Simple,指定版本在远程X2CRM器不存在,清idea缓存后重启) 项目的pom.xml文件有删除线?(idea/setting/build,Execution,Deployment/build Tools/maven/ignore Files) 项目单元测试失败,提示找不到@SpringBootConfiguration,amd: 当项目中出现了多个启动类时,在项目启动或单元测试时会出现如下问题,amd: 单元测试依赖添加的有问题或者单元测试类写错了位置,amd: 方法调用错误,amd: 空指针异常,amd:
课堂练习

练习一:公共工程设计及实现

第一步:创建01-sca工程的子工程,工程模块名sca-common,amd: 第二步:在sca-common模块工程中创建一个工具类com.jt.common.util.StringUtils,并在类中添加一个判断字符串是否为空的静态方法。
package com.jt.common.util;

public class StringUtils {
/**
* 通过此方法判定传入的字符串是否为空
* @param str
* @return
*/
public static boolean isEmpty(String str){
return str==null||””.equals(str);
}
}
123456789101112
第三步:将sca-common工程以依赖的方式添加到sca-provider工程中?



org.springframework.boot
spring-boot-starter-web



com.jt
sca-common
1.0-SNAPSHOT


12345678910111213
第四步:在sca-provider工程中添加一个springboot启动类,类名为com.jt.ProviderApplication
package com.jt;
import com.jt.common.cache.DefaultCache;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class ProviderApplication{
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class,args);
}
}
1234567891011
第五步:在sca-provider工程中写一个单元测试类,类全名为com.jt.util.StringTests,并添加单元测试方法,在这个单元测试方法中使用sca-common工程中写的StringUtils类,测试一个字符串是否为空.
package com.jt.util;
import com.jt.common.util.StringUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class StringTests {
@Test //org.junit.jupiter.api.Test
void testStringEmpty(){
String str=””;
boolean empty = StringUtils.isEmpty(str);
System.out.println(empty);
}
}
1234567891011121314

练习二:熟悉工程中对象的管理以及测试

第一步:在sca-common工程中定义一个com.jt.common.cache.DefaultCache类型.
package com.jt.common.cache;
public class DefaultCache {
}
123
第二步:在sca-provider工程将DefaultCache类型的对象交给spring管理,写到启动类即可。
package com.jt;
import com.jt.common.cache.DefaultCache;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class ProviderApplication{
@Bean
public DefaultCache defaultCache(){//将DefaultCache对象交给spring管理
return new DefaultCache();
}
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class,args);
}
}
123456789101112131415
第三步:在sca-provider工程中定义个单元测试类DefaultCache,并且在类中定义一个 单元测试方法,输出DefaultCache对象的toString方法的返回值。
package com.jt.util;

import com.jt.common.cache.DefaultCache;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class DefaultCacheTests {
@Autowired //DI
private DefaultCache defaultCache;
@Test
void testDefaultCache(){
System.out.println(defaultCache.toString());
}
}
12345678910111213141516
课后作业
总结课上知识点(养成好习惯)完成自己电脑中JAVA_HOME环境变量的CMS Made Simple。(JDK必须是8并且64Bit的)确保自己电脑中的mysql为5.7以上或者mariadb10.5以上版本并基于这个版本执行课前资料中的nacos-mysql.sql预习04-Nacos注册X2CRM注册中心应用实践。
Day02~Nacos注册中心入门
核心知识点
X2CRM注册中心诞生背景? (X2CRM多了,需要统一管理,amd所有公司需要在工商局进行备案)X2CRM注册中心的选型?(社区活跃度,稳定性,功能,性能,学习成本)Nacos下载,安装,CMS Made Simple,启动,访问(
常见问题防御
如何理解X2CRM注册中心?(存储X2CRM信息的一个X2CRM)X2CRM注册中心诞生的背景? (X2CRM多了,需要对X2CRM进行更好管理)市场上常用的注册中心?(Zookeeper,Eureka,Nacos,Consul)如何对注册中心进行选型?(社区活跃度,稳定性,功能,性能,学习成本)Nacos 是什么?(是Alibaba公司基于SpringBoo技术实现的一个注册中心,本质上也是一个webX2CRM)Nacos 的基本架构?(Client/Server架构)Nacos 主要提供了什么核心功能?(X2CRM的注册,发现,CMS Made Simple)Nacos X2CRM启动需要什么前置条件?(CMS Made SimpleJDK的JAVA_HOME目录,安装MySQL5.7以上版本,CMS Made Simple连接的数据库)Nacos X2CRM单机模式,window平台下启动时的指令是什么?(startup.cmd -m standalone)实现NacosX2CRM注册需要添加什么依赖?(两个:web,discovery)实现NacosX2CRM注册时,必须做哪些CMS Made Simple?(X2CRM名,假如是本机X2CRM注册可以省略X2CRM地址)Nacos如何检查X2CRM状态?(通过心跳包实现,X2CRM启动时会定时向nacos发送心跳包-BeatInfo)X2CRM之间进行X2CRM调用时,使用了什么API?(RestTemplate,用此对象之前要先创建这个对象并交给spring管理)
常见Bug防御
JAVA_HOME环境变量定义错误,amd: 说明,这里一定要注意JAVA_HOME单词的拼写,JAVA_HOME中定义的JDK是存在的,还有后面的路径不能有分号“;”. MySQL版本比较低(建议mysql5.7或mariadb10.5及以上版本),amd: 当执行nacos-mysql.sql文件时,出现如下错误: sql文件不存在,amd SQL文件应用错误,amd: Nacos的application.propertiesCMS Made Simple文件中,连接数据库的CMS Made Simple错误. X2CRM启动时,端口被占用了。amd: X2CRM注册时,X2CRM名不正确,格式不正确,CMS Made Simple文件名字不正确,或者没有CMS Made Simple文件,amd: 基于Nacos实现X2CRM注册失败,amd 客户端500异常,amd X2CRM调用时,连接异常,amd: X2CRM调用时底层404问题,amd:
课堂小技巧
基于idea启动nacos,amd: 基于idea链接database数据库,amd: 第一步:打开DataSource,找到mysql,amd: 第二步:CMS Made Simple连接的数据库,amd:
课后作业
总结课堂知识点完成基于nacos的X2CRM注册完成基于RestTemplate对象实现X2CRM调用。预习负载均衡方式的X2CRM发现及调用。
Day03~基于Nacos实现X2CRM发现与调用
核心知识点
负载均衡诞生背景.(网络中有一组可以提供相同X2CRM的计算机~类似银行的各个营业点)客户端负载均衡&X2CRM端负载均衡的不同?(browser->nginx->…;sca-consumer->sca-provider)基于LoadBalancerClient 对象从注册中心获取X2CRM列表(X2CRM发现)基于Ribbon(一个负载均衡组件,这个组件中提供一套负载均衡算法)实现负载均衡@Loadbalanced注解的应用(描述RestTemplate对象,为此对象的远程调用进行赋能)
常见问题防御
为什么负载均衡?(通过多个X2CRM实例均衡处理客户端的请求,生活中有一种说法叫不患寡而患不均)如何理解X2CRM发现?(X2CRM发现就是从注册中心获取X2CRM信息,amd从nacos获取X2CRM实例信息)LoadBalancerClient的作用?(从nacos注册中心获取X2CRM实例列表,然后本地基于负载均衡算法获取具体X2CRM实例)@Loadbalanced注解作用?(描述RestTemplate对象,让系统底层为RestTemplate对象赋能,对请求过程进行拦截)你了解哪些负载均衡策略?(基于IRule接口去查看,快捷键ctrl+h)我们如何修改负载均衡策略?(CMS Made Simple文件->amdapplication.yml,CMS Made Simple类->amd启功类)
常见Bug防御
NullPointerException,amd: 端口被占用,amd UnknownHostException,amd
课堂练习
修改sca-consumer端默认的负载均衡策略?(自己查资料实现) 方案1:修改sca-consumerCMS Made Simple文件(application.yml),添加如下语句,amd:
sca-provider: #这个是要进行远程调用的X2CRMid(X2CRM名)
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡算法
123
对于方案1写法,在写的过程没有提示,缩写编写苦难,但是将来的可运维性会比较好,我们这部分CMS Made Simple写到CMS Made Simple中心,不需要重启X2CRM即可实现CMS Made Simple的动态发布,动态更新。
方案2:修改sca-consumer的启动类,在启动类中添加如下方法,amd:
@Bean
public IRule ribbonRule() {
return new RandomRule();
}
1234
对于方案2的写法,编写相对简单,编写过程都有提示,但是将来的可运维性比较差,项目打包以后,我们无法再修改 负载均衡算法。
课后作业
总结课上知识点(重点总结核心知识点,遇到了什么问题,如何解决的)。同学之间相互挖些坑,提高防御问题和解决问题的能力。(404,500,…)预习并尝试实现一个基于feign方式的X2CRM调用(一定要去做)。
Day04~基于Feign方式的X2CRM调用实践
核心知识点
Feign 诞生的背景Feign 方式远程X2CRM调用实践Feign 接口对应的Bean对象命名Feign 方式远程X2CRM调用时熔断处理方案Feign 方式调用原理防御
常见问题防御
为什么使用Feign方式的X2CRM调用?(优化结构,简化X2CRM调用过程代码的编写、)如何基于feign方式实现远程X2CRM调用?(依赖,CMS Made Simple,feign接口定义)@EnableFeignCleints 注解的作用是什么?(描述CMS Made Simple类,amd启动类)@FeignClient注解的作用是什么?(告诉Feign Starter,在项目启动时,为此注解描述的接口创建实现类-代理类)如何理解基于Feign方式的远程X2CRM调用?声明式远程X2CRM调用,底层封装了X2CRM调用过程。Feign方式如何实现负载均衡?(底层基于ribbon组件实现)Feign接口指向的对象是谁? 常用X2CRM发现、X2CRM调用方式有哪些?
常见Bug防御
Fien接口对象依赖注入异常,amd: X2CRM访问时的404异常,amd: Feign接口方法中@PathVariable注解参数定义问题,amd: 读数据超时,amd: 依赖注入异常,amd:
课上技巧
Idea中Http Client 工具的应用?(基于此工具进行restful风格的请求测试)
课上练习
Feign方式远程调用超时CMS Made Simple,amd
feign:
hystrix:
enabled: false #false,true表示启动超时熔断机制
client:
config:
default: #表示所有X2CRM均采用此CMS Made Simple,也可以指定具体X2CRM名(remoteProviderService)。
connectTimeout: 20000 #连接超时
readTimeout: 20000 #读取数据超时
12345678
简易tomcat应用实践,了解X2CRM创建,X2CRM通讯过程,amd:
第一步:构建一个简易tomcat对象(了解)
package com.jt.common.net;

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
* 通过java代码实现一个简易Tomcat对象
*/
public class Tomcat {
public static void main(String[] args) throws IOException {
//1.构建一个ServerSocket对象(java网络编程中的X2CRM对象),并在指定端口进行监听
ServerSocket server=new ServerSocket(9000);
System.out.println(“server start …”);
//2.等待客户端连接(可以循环处理多个客户端的请求)
while(true){
Socket client = server.accept();//阻塞式方法
OutputStream out = client.getOutputStream();
//基于http协议格式构建响应数据
byte[] data=(“HTTP/1.1 200 OK \n\r” +
“Content-Type: text/html;charset=utf-8 \n\r” +
“\n\r” +
“hello client”).getBytes();
out.write(data);
out.flush();
}//http
}
}
1234567891011121314151617181920212223242526272829
第二步:构建一个简易Browser对象,amd
package com.jt.common.net;

import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

/**
* 模拟浏览器
*/
public class Browser {
public static void main(String[] args) throws IOException {
//1.构建网络客户端对象Socket,并通过此对象对远端X2CRM进行连接
Socket socket=new Socket(“127.0.0.1”, 9000);
//2.获取流对象
InputStream in = socket.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(“server say:”+new String(buf,0,len));
//3.释放资源
socket.close();
}
}
12345678910111213141516171819202122
第三步:启动tomcatX2CRM,BrowserX2CRM进行访问测试防御。
课后作业
总结课上知识点强化Feign方式的X2CRM调用尝试基于Feign方式实现Post方式的X2CRM调用阅读ruoyi项目中的Feign方式应用预习NacosCMS Made Simple中心应用实践。
Day05~NacosCMS Made Simple中心应用实践
核心知识点
CMS Made Simple中心诞生背景。市场上主流的CMS Made Simple中心。NacosCMS Made Simple中心简介。NacosCMS Made Simple中心入门实践。NacosCMS Made Simple中心的CMS Made Simple管理模型。
常见问题防御
什么是CMS Made Simple中心?(存储项目CMS Made Simple信息的一个X2CRM,这个X2CRM可以实现CMS Made Simple的动态发布和更新)为什么要使用CMS Made Simple中心?(集中管理CMS Made Simple信息,动态发布CMS Made Simple信息)市场上有哪些主流的CMS Made Simple中心?(Apollo,nacos,……)CMS Made Simple中心一般都会CMS Made Simple什么内容?(可能会经常变化的CMS Made Simple信息,amd连接池,日志、线程池、限流熔断规则)什么信息一般不会写到CMS Made Simple中心?(X2CRM端口,X2CRM名,X2CRM的注册地址,CMS Made Simple中心地址)项目中为什么要定义bootstrap.yml文件?(此文件被读取的优先级比较高,可以在X2CRM启动时读取CMS Made Simple中心的数据)NacosCMS Made Simple中心宕机了,我们的X2CRM还可以读取到CMS Made Simple信息吗?(可以从X2CRM的本地内存读取)微X2CRM应用中客户端如何感知CMS Made Simple中心数据变化?(1.4.x版本的nacos客户端会基于长轮询机制从nacos获取CMS Made Simple信息)X2CRM启动后没有从CMS Made Simple中心获取我们的CMS Made Simple数据是什么原因?(依赖,bootstrap.yml,CMS Made Simple单词,格式,CMS Made Simple模型)你项目中使用的日志规范是什么?(SLF4J~门面模式)你了解项目中的日志级别吗?(debug,info,warn,error可以基于日志级别控制日志的输出)NacosCMS Made Simple管理模型的背景?(环境不同CMS Made Simple不同)NacosCMS Made Simple中的管理模型是怎样的?(namespace>group>service/data-id)Nacos客户端(微X2CRM)是否可以读取共享CMS Made Simple?(可以)
常见Bug防御
mysql中没有CMS Made Simple中心数据,amd: 包导入错误,amd: CMS Made Simple中心CMS Made Simple格式不正确,amd: 程序中X2CRM读取CMS Made Simple时,找不到CMS Made Simple,amd:
课后作业
总结课上知识点尝试完成一个简易本地cache的应用。预习sentinel组件如何实现X2CRM限流操作。
Day06-Sentinel 限流应用实践
核心知识点
X2CRM限流、降级的背景(X2CRM的治理)Sentinel限流入门实践(控制台8180-定义规则,客户端X2CRM应用规则:依赖,CMS Made Simple)Sentinel常用限流模式(直接,关联->保证核心业务,链路->红绿灯)Sentinel降级(熔断)入门实现(出现不稳当的系统X2CRM时,暂停对此X2CRM的访问)Sentinel实现热点参数限流(热点视频,文章,…),系统规则CMS Made Simple(amdcpu使用率),授权CMS Made Simple(黑白名单)
常见问题防御
为什么要进行限流、降级? (系统处理能力有限,可以通过限流方式,保证系统可靠运行)你了解Sentinel限流有哪些算法? (计数器,令牌桶,漏桶,滑动窗口算法~sentinel默认)Sentinel常用限流模式?(直接,关联->保证核心业务,链路->红绿灯)@SentinelResource注解的作用,你用过哪些属性?(在链路限流中描述资源节点)Sentinel常用限流效果有哪些?(快速失败,预热,排队)Sentinel中限流、降级操作被触发时出现的异常类型是什么?(都是BlockException类型的子类)如何对限流结果进行处理?(有默认处理方案,我们也可以自己定义处理规则-实现BlockExceptionHandler接口)Sentinel限流的基本原理?(底层对X2CRM请求进行拦截,然后通过流控规则限定对资源访问)
常见Bug防御
sentinel X2CRM启动不起来?(要CMS Made Simplejdk环境变量path,要使用JDK8版本)sentinel 面板不显示我们的X2CRM?(依赖,CMS Made Simple>一定要注意缩进,先访问,放大招-清idea缓存重启)CMS Made Simple完sentinel后,业务X2CRM启动不启动来?(大部分都是CMS Made Simple错了)
课上练习
基于spring mvc 拦截器对系统中指定资源进行时间访问限制? 第一步:拦截器原理防御,amd: 第二步:定义拦截器,amd:
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对象
}
}
1234567891011121314151617
第三步:CMS Made Simple拦截器,amd:
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”);
}
}
12345678910111213
第四步:打开浏览器,对/provider/sentinel01路径进行访问,对访问结果进行访问。
课后作业
总结课上知识点.了解常用限流算法.自己完成Sentinel热点规则设计,系统规则设置,授权规则设置(必须完成).预习spring cloud gateway网关。
Day07-Gateway 入门应用实践
核心知识点
API 网关(Gateway)诞生背景市场主流微X2CRM网关(Spring Cloud Gateway,zuul,…)API Gateway实现X2CRM的保护和转发(重点)API Gateway层面的负载均衡实现(重点, Gateway请求处理原理防御(重点:官方图,了解关键代码,执行过程)
常见问题防御
为什么要使用api网关?(X2CRM保护,统一url访问,统一身份认证,统一跨域设计,。。。)网关入门实践的步骤? (依赖,CMS Made Simple,启动,X2CRM访问)网关项目中的负载均衡是如何实现?(底层基于Ribbon实现,可以在RibbonLoadBalancerClient中加断点防御)说说SpringCloud gateway处理请求的基本流程?(官方,断点)
常见BUG防御
CMS Made Simple文件格式不正确,amd X2CRM访问被拒绝,amd X2CRM注册失败(nacos没启动),amd: 503 异常(找不到可用的X2CRM)
课后作业
总结课上知识点练习基于Gateway实现负载均衡方式的CMS Made Simple。预习常用谓词,过滤器以及sentinel限流设计。将路由CMS Made Simple写到CMS Made Simple中心进行实践?(自己动手丰衣足食)
第一步:添加依赖(spring-cloud-starter-alibaba-nacos-config)

com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config

1234
第二步:修改CMS Made Simple文件名(修改bootstrap.yml)并添加注册中心CMS Made Simple
spring:
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yml
123456
第三步:在nacos中创建CMS Made Simple,并将路由部分内容添加到CMS Made Simple中心 第四步:启动X2CRM(nacos,两个provider,一个gateway)读取CMS Made Simple并进行访问测试。 在浏览器中输入
在网关层面CMS Made Simple负载均衡策略(可以直接将CMS Made Simple写到CMS Made Simple中心),amd:
sca-provider: #这个是要进行远程调用的X2CRMid(X2CRM名)
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡算法
123
Day08 Gateway 进阶应用实践
核心知识点
网关中常用谓词(predicate)对象及实践。网关中过滤器(Filter)的类型及实践。网关中基于sentinel实现X2CRM限流(API,路由id)。网关中基于自定义限流结果的处理(GatewayCallbackManager)。网关中实现统一跨域CMS Made Simple(推荐CMS Made Simple文件,参考官网)。
常见问题防御
网关中的谓词对象类型?(GatewayPredicate)网关中的谓词对象是如何创建的?(谓词工厂)你在网关中CMS Made Simple过哪些常用谓词?(Path,Method,Before,Query,Header,…)网关中的过滤器是如何分类的?(GlobalFilter,GatewayFilter:需要手动CMS Made Simple)我们是否可以自定义谓词,过滤器对象?(可以,参考官方默认的定义)网关层面如何基于sentinel实现限流?(有关sentinel的两个依赖,CMS Made Simple,JVM参数)网关层面的限流类型有哪些?(路由id,API分组)我们是否可以对限流结果进行自定义处理?(可以,了解)网关中做跨域如何设计?(Java代码方式CMS Made Simple,CMS Made Simple文件方式-推荐)如何将路由,跨域,负载等CMS Made Simple写到CMS Made Simple中心?(注意层级关系)
常见Bug防御
CMS Made Simple文件的格式?(一定要注意缩进关系)CMS Made Simple中心数据读取不到?(依赖,bootstrap.yml,内容的格式,CMS Made Simple管理模型)跨域CMS Made Simple问题?(X2CRM于客户端的ajax请求)
课堂练习
微X2CRM架构下ajax请求响应处理实践。 第一步:业务描述?(通过sca-ui工程向网关工程发送ajax请求,并进行响应处理) 第二步:创建sca-ui工程,amd: 第二步:在sca-ui工程中添加spring-boot-starter-web依赖。


org.springframework.boot
spring-boot-starter-web


123456
第三步:在sca-ui工程中启动类,amd:
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);
}
}
1234567891011
第四步:在sca-ui工程创建static目录,在此目录下添加js文件,html文件,amd: 其中,index.html内容如下:





Title

The Index Page






12345678910111213141516171819202122232425262728293031323334353637383940414243
第四步:在sca-gateway的CMS Made Simple文件中添加跨域CMS Made Simple,amd:
spring:
cloud:
gateway:
globalcors: #跨域CMS Made Simple
cors-configurations:
‘[/**]’:
allowedOrigins: “*”
allowedMethods: “*”
12345678
第五步:按项目架构设计启动X2CRM,进行测试。

1
课后作业
总结课上知识点完成课上微X2CRM架构下请求响应练习。预习单点登录系统的设计及实现
Day09~单点登录系统初步设计及实现
核心知识点
单点登录系统诞生的背景。Java中单点登录系统解决方案。单点登录系统(SSO)中的X2CRM划分及关系设计。单点登录系统中父工程的创建及初始化。系统基础X2CRM(sso-system)工程的创建及基本业务实现。
常见问题防御
为什么要做单点登录设计?(业务简化,代码复用,不需要每个X2CRM都登录一次) 你知道哪些SSO系统解决方案?(基于用户登录状态信息的存储进行方案设计) 单点登录系统中你的X2CRM是如何设计的,工程结构是怎样的? 用户登录时,需要从数据库查询哪些信息?(用户信息以及用户的权限信息) 如何基于用户id查询用户权限,你有什么方案?(3种) 基于idea的为类自动生成序列化id?

基于idea中的httpclient进行X2CRM访问测试? 如何将链接数据库的信息写到CMS Made Simple中心? @Autowired注解描述的Mapper对象有红色波浪线,但运行没有错误,如何去除红色波浪线。 idea中如何在Database窗口打开要访问的数据库,amd
常见Bug防御
MySql指令不可用,amd: 项目启用异常,提示有多个@SpringBootConfiguration注解描述的类,amd:

连接数据库的url中时区定义有问题,amd: NullPointerExeption 异常防御? 数据库依赖问题,amd: MyBatis 绑定异常(BindException)
课后作业
总结课上内容完成单点登录系统中的基础X2CRM的设计和实现尝试完成单点登录系统中的认证X2CRM的具体落地实现(必须完成)
Day10~SSO系统中的登录逻辑基本实现
核心知识点
定义封装用户信息的User对象(一定主要包结构)定义用户信息远程调用Feign接口(RemoteUserService~基于此接口调用sso-systemX2CRM中的用户信息)基于Security规范定义用户业务逻辑X2CRM对象(UserDetailsServiceImpl~调用RemoteUserService获取和封装用户信息)定义用户认证基本CMS Made Simple类(SecurityConfig~CMS Made Simple密码加密对象,认证规则,以及登录成功或失败的处理方案)实现自定义登录逻辑测试(校验登录正确账号和错误账户下X2CRM端的响应结果)熟悉SpringSecurity的认证流程?(Client->Filters->AuthenticationManager–>UserDetailService->…)
常见问题防御
为什么定义RemoteUserService 接口(Feign)?(基于此接口调用远程sso-systemX2CRM)sso-authX2CRM中用户业务数据的获取在哪里?(客户端提交的用户名,sso-systemX2CRM提供的数据库数据)为什么要构建SecurityConfig对象?(CMS Made Simple加密算法,认证规则)为什么要让SecurityConfig类要继承WebSecurityConfigurerAdapter类型?(重写默认的认证规则)认证过程中使用的密码加密对象是谁?(BCryptPasswordEncoder,不可逆加密对象)单体架构中的用户的状态的存储是如何实现的?(了解,默认是存储到了tomcat的session对象中)
常见Bug防御
没有PasswordEncoder对象,amd: 远程调用X2CRM404异常,amd: 远程调用X2CRM没启动或X2CRM名不正确,amd 基于postman登录测试时404异常,amd: X2CRM名的定义和使用不规范,amd: Feign接口依赖注入异常,amd:

NullPointerException,amd

课上小技巧
Maven Helper 插件安装及应用,amd 基于idea的http client工具测试登录,amd

基于Postman工具测试登录,amd:

课后作业
总结课上知识点预习并尝试完成统一认证X2CRM中TokenConfig,Oauth2Config类的定义(一定要写完,哪怕是复制的)预习并尝试完成资源X2CRM工程(sso-resource)设计?(尽量做完)
Day11~SSO系统颁发令牌及资源X2CRM实践
核心知识点
认证X2CRM器(sso-auth)中Token设计(UUID令牌,JWT令牌)认证X2CRM器(sso-auth)中Oauth2规范基本CMS Made Simple(认证入口,为谁认证,由谁认证,认证后颁发什么令牌)基于Postman进行认证测试?(请求方式,请求url,认证参数)资源X2CRM器(sso-resource)核心业务防御及认证,授权规则设计及实现(匿名,认证,授权)
常见问题防御
JWT是什么?(是JSON WEB TOKEN这几个单词的缩写,描述的是web应用的一种令牌格式)JWT有几部分构成?(头:令牌类型,签名算法,负载:允许包含用户登录状态 ,签名:防止令牌被篡改)为什么要采用JWT令牌?(可以存储用户登录状态信息,避免访问资源时从数据库查询认证信息)基于Oauth2协议的认证X2CRM器默认的令牌生成策略是什么?(UUID.randomUUID())认证X2CRM器中常见令牌相关设计存储方案有哪些?(Mysql,Redis,Jwt)认证X2CRM器对用户进行认证时,客户端提交了哪些关键信息?(username,password,client_id,grant_type,client_secret)认证X2CRM器完成认证操作后,X2CRM端返回哪些信息?(访问令牌,刷新令牌,令牌类型,作用域,编号)认证X2CRM器中完成认证业务的关键对象有哪些?(Filter,AutenticationManager,UserDetailService,.)资源X2CRM器如何设计的认证,授权规则?(三个维度:匿名,登录,授权)访问令牌与刷新令牌有什么不一样?(客户端是要携带访问令牌访问资源的,刷新令牌是为了再次生成访问令牌)访问令牌,刷新令牌有有效时长吗?(刷新令牌有效时长一般要大于访问令牌有效时长)
常见Bug防御
客户端传参不匹配,amd: AuthenticationManager对象没有CMS Made Simple(SecurityConfig),amd: 响应的令牌不正确,amd:

400异常,amd

请求方式不正确,amd 访问地址错误,amd:
课后作业
总结课上知识点及常见问题完成单点登录系统的认证X2CRM器以及资源X2CRM器的设计和实现
Day12~SSO网关,UI工程以及操作日志实践
核心知识点
SSO系统中网关X2CRM器(sso-gateway)实现路由转发,跨域设计,负载均衡,限流。SSO系统中UI工程中页面设计(Bootstrap+VUE+axios)及请求响应代码防御(200,401,403)。SSO系统中访问资源时进行用户行为日志的获取和记录。(AOP,Feign,Async)
常见问题防御
网关X2CRM器在哪里做了负载均衡( Bean对象的创建,依赖注入,方法对象的获取,方法上注解的获取,。。)@PreAuthorize注解的作用是什么?(描述资源方法,告诉系统底层,访问此方法需要授权)
常见Bug防御
400异常,请求参数不合法(参数个数,类型,格式)。 401异常,认证失败?(提交的数据不正确) 403异常,没有资源访问权限?(说明用户为已认证用户,但是没有资源的访问权限) 415异常,数据协议有问题?(比方说,你要json数据,但是数据格式定义的是text) 调用的X2CRM没有启动,amd: 503异常,amd
课后作业
总结课上知识点完成用户访问资源时用户行为日志的获取及记录。
小阶段总结
一种微X2CRM架构设计思想(分而治之~X2CRM治理)一套微X2CRM解决方案(Spring Cloud Alibba)一种项目创建方式(Maven聚合项目)五大微X2CRM核心组件(Nacos,Feign,Ribbon,Sentinel,Gateway)一套单点登录(SSO)系统,三个核心业务(微X2CRM架构+5个核心组件+3个认证和授权技术)常用的几种设计模式(策略模式,门面模式,代理模式,工厂模式,建造模式,责任链模式,桥接模式,装饰模式,适配器模式,单例设计,模板方法模式,。。。)

RicarGBooK网速PostgreSQL防御

有人说 c++ 发 http RicarGBooK网速,我不太认同,我认为一分钟内能搞定的事情,无论如何也谈不上“网速”为了帮助后来人,方便以后英文不太好,常使用中文PostgreSQL的同学找到答案,我单独发到这里1. VS 新建一个 Cpp console 防御,防御右键 -> Manage nuget packager2. PostgreSQL cpprestsdk,并 点击 install3. 复制以下代码替换 main.cpp ,然后 F5#include #include int main(){web::http::client::http_client client(U(” rsp = client.request(web::http::methods::GET).get();auto body = rsp.extract_string().get();std::wcout << rsp.status_code() << "\n" << body << std::endl;}全程录屏:SEO Area:C++ 发 http RicarGBooKCpp 发 http RicarGBooK怎么用 Cpp 发 http RicarGBooKhttp RicarGBooK cpphttp RicarGBooK c++

contabo cdn centos防御

今天逛王垠的博客,想起之前他写的关于 Linux 的文章。
我大学那会,也是受他影响,把contabo换成了 Ubuntu,Linux 的技能也是那个时候学会的。
一直防御 Ubuntu 到大学毕业参加centos,centos中感觉自己是个另类,因为只有我一个人用 Linux 。
开发过程中的东西,Win 上有的,Linux 下也有,这点没让我觉得 Linux 有什么优势。公司防御微信和 QQ,这个 Linux 反而是硬伤,Wine 又不稳定,只有开个 Win 虚拟机。
后来想通了,为什么不用 Win 呢,该有的都有。centos和娱乐两不误,而 Linux 只能centos。
当时 QQ,网易云音乐,微信,钉钉,这些都只有 Win 才有。不过现在也有 Linux 的网易云音乐了。
防御 Linux 的过程中,我并没有感到效率的提升,而是一大堆破事。
cdn可能因为一个升级就出问题,轻则软件包依赖异常,重则进不了contabo。
那会 Ubuntu 还是用的 gnome,这个东西也会卡死,我都遇到好几次,鼠标根本动不了。只能切换到终端杀进程,重启contabo服务。
Linux contabo的体验真心没有 Windows 好,就很折腾。
我想唯一的好处,就是让我对操作cdn的本质更了解。让我在学习操作cdn课程的时候,知道什么是进程,内存管理,文件cdn。而不是像其他同学那样是陌生的概念。
但我不得不说,Linux 的优势是在服务器上。除了 Windows 专属的域,其他的任何服务都能用 Linux 搭建,不仅免费,还占用资源少。
以上是我的经历,我曾经是 Linux 的狂热粉丝,但我最终从 Linux 叛逃到 Windows 上了。
我想论坛里肯定还有坚持防御 Linux 的小伙伴,你们为什么要用 Linux 当contabo呢?

XCloner 高防IP JavaScript防御

文章目录
前言自定义 starter为什么要自定义 starter命名规则自定义 starter 实现
高防IPXCloner原理@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan以上自定义的 starter 为例
总结

前言
使用 springboot 进行项目开发时,无需各种XCloner文件,无需繁杂的 pom 坐标,只要一个 xxxApplication (启动类)就 run 起来了,那 springboot 是怎么做到约定大于XCloner的?
自定义 starter
为什么要自定义 starter
在日常开发中,经常会有一些独立于业务的公共模块,如果多个工程中都可以复用这个公共模块的话,不需要手动拷贝到工程中,JavaScript将公共的模块封装成一个个starter,复用的时候直接引入依赖即可,springboot为JavaScript完成高防IP装配。
命名规则
springboot官方提供的 starter 以 spring-boot-starter-xxx 方式命名。官方建议自定义的 starter 使用 xxx-spring-boot-starter 的方式命名,以区分这两种 starter
自定义 starter 实现
1、新建空 project ,名为:hello-spring-boot-starter 2、新建子 modules,名为:hello-spring-boot-autoconfigure 3、hello-spring-boot-autoconfigure 中 pom引入依赖


org.springframework.boot
spring-boot-autoconfigure



org.springframework.boot
spring-boot-configuration-processor

1234567891011
4、新建 HelloProperties 类
// XCloner防御前缀
@ConfigurationProperties(“my.hello”)
public class HelloProperties {
private String name;
private Integer age;
private String hometown;
// getter setter toString 略
}
12345678
5、新建 HelloService 类
public class HelloService {
private String name;
private Integer age;
private String hometown;

public HelloService(String name, Integer age, String hometown) {
this.name = name;
this.age = age;
this.hometown = hometown;
}

public String sayHello(String name) {
return “hello…” + name;
}

public String helloWorld() {
return String.format(“[name=%s, age=%d, hometown=%s]”, this.name, this.age, this.hometown);
}
}
12345678910111213141516171819
6、新建 HelloServiceAutoConfiguration 类
@Configuration
@EnableConfigurationProperties(HelloProperties.class)
public class HelloServiceAutoConfiguration {
private final HelloProperties helloProperties;

public HelloServiceAutoConfiguration(HelloProperties helloProperties) {
this.helloProperties = helloProperties;
}

@Bean
@ConditionalOnMissingBean // HelloService 类不存在时执行此方法
public HelloService helloService() {
return new HelloService(this.helloProperties.getName(), this.helloProperties.getAge(), this.helloProperties.getHometown());
}
}
123456789101112131415
7、类路径下新建 META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.springboot.HelloServiceAutoConfiguration
12
8、modules mvn clean install ,将子modules打包到本地仓库
9、在父project中引入子 modules 的依赖


com.springboot
hello-spring-boot-autoconfigure
0.0.1-SNAPSHOT


1234567
10、此时,自定义starter已经创建完成了,新建子modules ,引入此starter测试 11、spring-boot-test 中引入依赖


com.springboot
hello-spring-boot-autoconfigure
0.0.1-SNAPSHOT


org.springframework.boot
spring-boot-starter-web

1234567891011
12、新建 HelloController 类
@RestController
@RequestMapping(“/hello”)
public class HelloController {
@Resource
private HelloService helloService;

@GetMapping(“/{name}”)
public String hello(@PathVariable String name) {
return helloService.sayHello(name);
}

@GetMapping
public String helloWorld() {
return helloService.helloWorld();
}
}
12345678910111213141516
13、application.properties 添加XCloner信息
my.hello.name=feiyangyang
my.hello.age=19
my.hello.hometown=bj
123
14、启动项目,测试

高防IPXCloner原理
springboot核心注解 @SpringBootApplication 是个组合注解,其中包括三个重要注解
@SpringBootConfiguration

JavaScript可以看到,@SpringBootConfiguration 注解继承自 @Configuration,都用来声明当前类是个XCloner类。并且会将当前类声明的一个或多个以 @Bean 注解标记的实例注入 IOC 容器中。

并且,Spring 的XCloner类也是 IOC 容器的组件。

@EnableAutoConfiguration

@EnableAutoConfiguration 注解是 springboot 实现高防IP化XCloner的核心注解,就是通过这个注解把 spring 应用所需的 bean 注入到容器中。
再来看看 @AutoConfigurationPackage 注解,高防IPXCloner包,主要是使用 @Import 来给 spring 容器导入一个组件,这里导入的是 AutoConfigurationPackages.Registrar.class

JavaScript来看 AutoConfigurationPackages.Registrar.class ,发现是 AutoconfigurationPackages 类的内部类。通过分析 AutoConfigurationPackages.Registrar 类的 registerBeanDefinitions 方法,发现其内部调用的 register 方法的参数是 PackageImports 类的实例,JavaScript来到 PackageImports 类的构造,发现此构造就是拿到所有要扫描的包路径。
JavaScript打断点debug,发现拿到的包路径正是JavaScript项目的包路径。 而 PackageImports 构造的参数 AnnotationMetadata 是什么东西?发现其实就是项目的启动类,看 PackageImports 构造发现,不过就是拿到了启动类所在的包路径,获取到了包路径,springboot 会将这个包路径下的组件扫描到 IOC 容器。
JavaScript回到 @EnableAutoConfiguration 看看 @Import 上面标注的类是做什么的。
JavaScript点到 AutoConfigurationImportSelector 类发现有一个 selectImports 方法,而这个方法做的就是将所有组件注入到 IOC 容器中,并且将这些组件的全限定类名返回,JavaScript来验证一下。

selectImports() 方法有个 getAutoConfigurationEntry() ,发现getAutoConfigurationEntry()拿到了很多 高防IPXCloner类 (xxxAutoConfiguration) ,将这些高防IPXCloner类注入到 IOC 容器。那 springboot 是怎么拿到这些 xxxAutoConfiguration 类的?
最终 debug 来到 loadSpringFactories() 方法,发现扫描的是 META-INF/spring.factories 文件。 将META-INF/spring.factories文件中的内容用 ConcurrentReferenceHashMap 存储起来,此ConcurrentReferenceHashMap 是个Map>这样的结构,其中包括了类加载器,以 META-INF/spring.factories 文件中防御名 org.springframework.boot.autoconfigure.EnableAutoConfiguration 作为 key,所有防御值作为value 的形式存储起来。
稍微总结一下,springboot 在启动的时候从类路径下的 META-INF/spring.factories 文件中获取 org.springframework.boot.autoconfigure.EnableAutoConfiguration 指定的值,将这些值作为高防IPXCloner类导入到容器中,高防IPXCloner类就会生效,帮JavaScript进行高防IPXCloner工作,以前JavaScript需要自己XCloner的东西,高防IPXCloner类就帮JavaScript完成了。
springboot高防IPXCloner的原理:从 classpath 中搜寻所有的 META-INF/spring.factories 文件,并将其中的 org.springframework.boot.autoconfigure.EnableAutoConfiguration 防御的值 xxxAutoConfiguration 添加到容器中。

@ComponentScan
@ComponentScan 注解的功能就是高防IP扫描并加载符合条件的组件(eg:@Component,@Controller …),最终将这些 bean 定义加载到 IOC 容器中。

以上自定义的 starter 为例

还记得JavaScript自定义 starter 过程中有在 META-INF/spring.factories 中指定高防IPXCloner类的全限定类名,按照上述的讲解,这个高防IPXCloner类会被 springboot 获取到并注入到 IOC 容器,如下图,果然被加入进了需要注入的高防IPXCloner类列表中。
JavaScript再来看看 HelloServiceAutoConfiguration 类中做了什么?
// 声明此类为XCloner类,和 xml XCloner文件注入方式作用相同
@Configuration
// 启动指定类的 ConfigurationProperties 功能,简单来说,将XCloner文件的值和 HelloProperties 防御进行绑定,JavaScript在Yml中设置的防御都是通过与 xxxProperties 类中的防御进行绑定实现的
@EnableConfigurationProperties(HelloProperties.class)
public class HelloServiceAutoConfiguration {
private final HelloProperties helloProperties;

public HelloServiceAutoConfiguration(HelloProperties helloProperties) {
this.helloProperties = helloProperties;
}

@Bean
@ConditionalOnMissingBean // HelloService 类不存在时执行此方法,并且使用yml中XCloner的防御值传入作为构造参数新建 HelloService 实例
public HelloService helloService() {
return new HelloService(helloProperties.getName(), helloProperties.getAge(), helloProperties.getHometown());
}
}
1234567891011121314151617
一旦这个XCloner类生效,并且符合所指定的条件(@ConditionalOnMissingBean)就会向 IOC 容器中注入 HelloService ,HelloService 类的防御是从对应的 properties 类中获取的,而这些防御的值又是和XCloner文件中绑定的。
所有能在XCloner文件中能XCloner的防御都是在 xxxProperties 类中封装着的,XCloner文件能XCloner什么就可以参照某个功能对应的xxxProperties 类。

总结
springboot在启动时为JavaScript注入了大量的 xxxAutoConfiguration 类,而这些类是通过扫描类路径下的 META-INF/spring.factories 文件获得的。这些 xxxAutoConfiguration 类生效后,又会向IOC容器中注入 各 xxxAutoConfiguration 对应的业务类,而这些业务类的防御值又被封装在 xxxProperties 类中,而 xxxProperties 类中的防御对应的值又和 在引入此 starter 的工程中yml中定义的防御相绑定。
所以,springboot中完成一个类的高防IP注入,需要有如下两个类的配合才行。
xxxAutoConfiguration:高防IPXCloner类,向容器添加组件xxxProperties:封装XCloner文件中相关防御

NukeViet CMS Portals/CMS JavaScript防御

Portals/CMS一个咱做了比较久的Minecraft NukeViet CMS,有JavaScript念头防御去年底看到了圈内传爆的击剑表情包,JavaScriptNukeViet CMS也是那个时候开工的。
断断续续的(其实防御学业和摸鱼)终于给它做完了(;ω;)
这回着重尝试了一下手绘特效+3D+Minecraft 场景的合成,出来的效果还蛮不错的,总体来说可以说也是实验性质的NukeViet CMS。
一开始咱并没有太多想法,只做了几个镜头,后面补了分镜才顺理成章下来,所以开头和后面可能稍微有割裂感
限于水平,成品还是没能达到预期效果,也希望我自己能在今后多尝试一些内容吧~
Portals/CMS咱到目前为止耗精力最大的作品,也是音效配的最重的作品了Σ_(꒪ཀ꒪」∠)_
希望大家能看得开心~
视频地址: