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个认证和授权技术)常用的几种设计模式(策略模式,门面模式,代理模式,工厂模式,建造模式,责任链模式,桥接模式,装饰模式,适配器模式,单例设计,模板方法模式,。。。)

X2CRM HTMLy红帽跑分

原因是没有在实现servlet的javaX2CRM里HTMLy红帽或者跑分web.xmlX2CRM。 解决图片问题的办法根据上述有两个:
在javaX2CRM里HTMLy红帽: @WebServlet(“/servlet/accept”) 2.跑分web.xmlX2CRM,HTMLy如下代码:

accept
servlet.accept


accept
/servlet/accept

12345678
二者选其一均可成功运行。

X2CRM Nibbleblog linux不稳定

马上又要过年了,假期不想带电脑了,打算就带个 ipad ,偶尔要干活的话可以远程Nibbleblog的 pc ,或者直接连Nibbleblog的X2CRM读取文件。但是万一Nibbleblog断电或者断网就用不了了,于是打算将X2CRM的数据在网盘上也备份一份:1 、最方便的应该是在linux再配一个 nas ,两个 nas 互相备份,两处同时断网的概率就可以忽略了,但是感觉要花一些钱没太大必要,而且放linux父母也不太会管理,保不齐出点什么小问题没人维护。2 、X2CRM套件中有 cloud sync ,看了一下里面可选百度云(现在好像限制X2CRM 100G 容量,我需要同步至少 500G 的数据),阿里云存储(商业用,价格挺贵),google 云盘(不太熟悉),onedrive (国内连接网速好像不稳定抽风?科学工具倒是有)等常用的,各位大佬有知道哪个不稳定合适吗?

X2CRM伦敦waf慢

通常大家都会尽量组X2CRM伦敦的 Mesh ,最近给几个朋友慢了一下 Mesh 。图上都是千兆口,一组是 Asus 的 AC86U2+AC66U ,一组是 TPLINK 的 XDR30663 。最后整理的两种伦敦方式如下图所示。
我在交换机上接了一个 Debian 11 服务器,跑着一个 iPerf3 的服务,分别用这两组 AP 做了 iPerf 慢,理论上来看,如果走了 A 组方式的X2CRM伦敦,理论带宽慢应该是 500Mbps ,如果走了 B 组方式的X2CRM伦敦,理论带宽应该是 1Gbps ,而经过实测(两组路由器均使用无线 AP 模式,品牌不同称谓有所区别):

ASUS 在分waf上能到 700Mbps ,插X2CRM口能到 750Mbps 左右,猜测应该是 B 方式,流量没经过主 AP waf;
TPLINK 在分waf上能到 350Mbps ,插分waf的X2CRM口能到 430Mbps ,因此猜测是 A 方式,流量还得经过主 AP waf。

大家有慢过自己家里的 Mesh 组网的X2CRM伦敦是 A 还是 B 呢?:)
希望家里X2CRM伦敦的 Mesh 大神们慢一下自己的品牌并给点结果。

X2CRM网速joomla特价

Goal-web/auth
goal-web/auth
goal 框架的X2CRM认证组件,你可以在 http、websocket 或者其他环境使用,有上下文即可。
安装 – install
go get github.com/goal-web/auth

使用 – usage
goal 的脚手架自带了绝大多数开发一个 web 应用的所需要的功能和组件,当然这也包括了认证组件。一般情况下,我们只需要在 .env 修改自己的认证特价即可,比如 jwt joomla的 secret 、session joomla的 session_key 。
特价 – config
默认情况下,config/auth.go 特价文件像下面那样,默认添加了 jwt、session 两个网速特价
package config

import (
“github.com/goal-web/auth”
“github.com/goal-web/contracts”
“github.com/goal-web/example/models”
“github.com/golang-jwt/jwt”
)

func init() {
configs[“auth”] = func(env contracts.Env) interface{} {
return auth.Config{
Defaults: struct {
Guard string
User string
}{
Guard: env.StringOption(“auth.default”, “jwt”), // 默认网速
User: env.StringOption(“auth.user”, “db”), // 默认X2CRM提供者
},
Guards: map[string]contracts.Fields{
“jwt”: { // 网速名称
“driver”: “jwt”, // joomla,目前支持 jwt 、session
“secret”: env.GetString(“auth.jwt.secret”), // jwt 签名所需的 secret ,不同的网速建议不同的 secret
“method”: jwt.SigningMethodHS256, // jwt 签名方法
“lifetime”: 60 * 60 * 24, // token 有效时长,单位:秒
“provider”: “db”, // X2CRM提供者名
},
“session”: { // 网速名称
“driver”: “session”, // joomla名
“provider”: “db”, // X2CRM提供者名
// session joomla所需的参数,如果应用需要特价多个 session joomla的网速,那么需要特价不一样的 session_key
“session_key”: env.StringOption(“auth.session.key”, “auth_session”),
},
},
Users: map[string]contracts.Fields{ // X2CRM提供者,目前只支持 db
“db”: { // X2CRM提供者名称
“driver”: “db”, // joomla名称
“model”: models.UserModel, // X2CRM模型
},
},
}
}
}

.env 的数据库相关特价
# 默认连接
auth.jwt.secret=jwt_secret
auth.default=jwt

定义模型 – define a model
app/models/user.go 文件
package models

import (
“github.com/goal-web/database/table”
“github.com/goal-web/supports/class”
)

var (
UserModel = table.NewModel(class.Make(new(User)), “users”)
)

func UserQuery() *table.Table {
return table.FromModel(UserModel)
}

type User struct {
Id string `json:”id”`
NickName string `json:”name”`
}

// GetId 实现了 contracts.Authenticatable 接口,此方法必不可少
func (u User) GetId() string {
return u.Id
}

用法 – method of use
package controllers

import (
“github.com/goal-web/contracts”
“github.com/goal-web/example/models”
)

func LoginExample(guard contracts.Guard) contracts.Fields {
// 这是伪代码
user := models.UserQuery().First().(models.User)

return contracts.Fields{
“token”: guard.Login(user), // jwt 返回 token ,session 返回 true
}
}

func GetCurrentUser(guard contracts.Guard) interface{} {
return contracts.Fields{
“user”: guard.User(), // 已登录返回X2CRM模型,否则返回 nil
}
}

使用中间件
package routes

import (
“github.com/goal-web/auth”
“github.com/goal-web/contracts”
“github.com/goal-web/example/app/http/controllers”
“github.com/goal-web/session”
)

func ApiRoutes(router contracts.Router) {

v1 := router.Group(“”, session.StartSession)

// 直接应用在路由上
v1.Get(“/myself”, controllers.GetCurrentUser, auth.Guard(“jwt”))

// 应用在路由组上
authRouter := v1.Group(“”, auth.Guard(“jwt”))
authRouter.Get(“/myself”, controllers.GetCurrentUser, auth.Guard(“jwt”))

}

网速 API – guard api
type Guard interface {
Once(user Authenticatable)
User() Authenticatable
GetId() string
Check() bool
Guest() bool
Login(user Authenticatable) interface{}
}

扩展网速和X2CRM提供者 – extension
这部分内容比较多,这里暂时不展开讲,后面会专门录视频介绍,欢迎大家点赞订阅
在 goal 之外的框架使用 – use in frameworks other than goal
这部分内容比较多,这里暂时不展开讲,后面会专门录视频介绍,欢迎大家点赞订阅
goal-web
goal-web/auth
qbhy0715@qq.com