暗中观察 - 暗中观察
type: channel
link: https://sunjianhua.cn/author/1/
description: 暗中观察
items: Ansible使用指南
items: Tesla 车机浏览器全屏代码0
items: 微服务开发框架整理
items: java程序打包神器
items: java排查问题神器
items: Spring Cloud Gateway 忽略网关特殊字符
items: 使用ShardingSphere分库分表
items: Spring之Mybatis工作原理及核心流程解析
items: Spring之SpringCloud 组件介绍
items: Spring之SpringBoot底层源码解析

Ansible使用指南
type: item
date: 2023-12-04T12:36:00+00:00
description: 一、基本概念二、安装2.1 安装pythonyum install python3 2.2 pip3 install --user ansibleyum install -y epel-release yum install -y ansible 三、使用3.1 基础：运行命令ansible -i ./hosts remote -v -m ping -u root --private-key=~/.ssh/id_rsa 3.2 剧本（Playbooks）ansible-playbook -i ./hosts nginx.yml 四、文档http://www.ansible.com.cn/index.htmlhttps://blog.csdn.net/pushiqiang/article/details/78126063

Tesla 车机浏览器全屏代码0
type: item
date: 2023-11-23T10:18:00+00:00
description: Tesla 车机浏览器全屏代码redirect:https://v.xxx.com/search_redirect.html?url=https://www.xxxx.com/xxx/redirec.html?redirect_url=https://sunjianhua.xyz?www.xxxx.com"

微服务开发框架整理
type: item
date: 2023-11-23T09:57:00+00:00
description: 1.架构代码说明2.开发规范3.使用示例说明

java程序打包神器
type: item
date: 2023-11-09T11:04:00+00:00
description: 下载链接https://www.ej-technologies.com/download/install4j/files https://www.ej-technologies.com/download/exe4j/files// install4j License // 适用于install4j最新版的注册码，谁还会想要使用破解版呢。 // v9 scS-NEO_PENG#890808-wm1fa21hg0qqz#82622 // v10 scS-NEO_PENG#890808-3gkd3i1jyekke#262a69

java排查问题神器
type: item
date: 2023-11-09T10:53:00+00:00
description: #下载链接： https://www.ej-technologies.com/download/jprofiler/files// JProfiler License // 适用于JProfiler最新版本的注册码，谁还会想要使用破解版呢。 // v13 scS-NEO_PENG#890808-g4tibemn0jen#37bb9 // v14 scS-J14-NEO_PENG#890808-1jqjtz91lywcp9#23624

Spring Cloud Gateway 忽略网关特殊字符
type: item
date: 2023-09-25T08:59:00+00:00
description: import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.codec.http.HttpRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.web.embedded.netty.NettyReactiveWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.stereotype.Component; import reactor.netty.ConnectionObserver; import reactor.netty.NettyPipeline; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; @Component @Slf4j public class EncodeQueryNettyWebServerCustomizer implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory> { /** * 需要encode的特殊字符 */ private final List<Character> charList = new ArrayList<Character>() { { // this.add('{'); // this.add('}'); // this.add('['); // this.add(']'); this.add('|'); } }; @Override public void customize(NettyReactiveWebServerFactory factory) { factory.addServerCustomizers(httpServer -> httpServer.observe((conn, state) -> { if (state == ConnectionObserver.State.CONNECTED) { conn.channel().pipeline().addAfter(NettyPipeline.HttpCodec, "", new QueryHandler()); } })); } class QueryHandler extends ChannelInboundHandlerAdapter { QueryHandler() { } @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws UnsupportedEncodingException { if (msg instanceof HttpRequest) { HttpRequest request = (HttpRequest) msg; String url = request.uri(); // fix url log.info("url: {}", url); String[] split = url.split("\\?"); StringBuilder fixUrl = new StringBuilder(split[0]); if (split.length > 1) { fixUrl.append("?"); char[] chars = split[1].toCharArray(); for (char aChar : chars) { if (charList.contains(aChar)) { fixUrl.append(URLEncoder.encode(String.valueOf(aChar), "UTF-8")); } else { fixUrl.append(aChar); } } } log.info("fixUrl: {}", fixUrl); request.setUri(fixUrl.toString()); } ctx.fireChannelRead(msg); } } }

使用ShardingSphere分库分表
type: item
date: 2023-04-19T11:43:00+00:00
description: 一、什么是 ShardingSphere简介: https://shardingsphere.apache.org/document/legacy/4.x/document/cn/overview/ https://shardingsphere.apache.org/document/current/cn/overview/ 二、使用SHARDING-JDBC2.1 使用手册数据分片读写分离强制路由编排治理分布式事务数据脱敏2.2 配置手册2.3 分片集成步骤1. 引入maven依赖 <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>${sharding-sphere.version}</version> </dependency> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-namespace</artifactId> <version>${sharding-sphere.version}</version> </dependency> 2. 规则配置Sharding-JDBC可以通过Java，YAML，Spring命名空间和Spring Boot Starter四种方式配置，开发者可根据场景选择适合的配置方式。详情请参见配置手册。3. 创建DataSource通过ShardingDataSourceFactory工厂和规则配置对象获取ShardingDataSource，ShardingDataSource实现自JDBC的标准接口DataSource。然后即可通过DataSource选择使用原生JDBC开发，或者使用JPA, MyBatis等ORM工具。DataSource dataSource = ShardingDataSourceFactory.createDataSource(dataSourceMap, shardingRuleConfig, props); 4.基于Java编码的规则配置Sharding-JDBC的分库分表通过规则配置描述，以下例子是根据user_id取模分库, 且根据order_id取模分表的两库两表的配置。// 配置真实数据源 Map<String, DataSource> dataSourceMap = new HashMap<>(); // 配置第一个数据源 BasicDataSource dataSource1 = new BasicDataSource(); dataSource1.setDriverClassName("com.mysql.jdbc.Driver"); dataSource1.setUrl("jdbc:mysql://localhost:3306/ds0"); dataSource1.setUsername("root"); dataSource1.setPassword(""); dataSourceMap.put("ds0", dataSource1); // 配置第二个数据源 BasicDataSource dataSource2 = new BasicDataSource(); dataSource2.setDriverClassName("com.mysql.jdbc.Driver"); dataSource2.setUrl("jdbc:mysql://localhost:3306/ds1"); dataSource2.setUsername("root"); dataSource2.setPassword(""); dataSourceMap.put("ds1", dataSource2); // 配置Order表规则 TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration("t_order","ds${0..1}.t_order${0..1}"); // 配置分库 + 分表策略 orderTableRuleConfig.setDatabaseShardingStrategyConfig(new InlineShardingStrategyConfiguration("user_id", "ds${user_id % 2}")); orderTableRuleConfig.setTableShardingStrategyConfig…

Spring之Mybatis工作原理及核心流程解析
type: item
date: 2023-04-19T08:25:00+00:00
description: 1、如何掌握MyBatis的工作原理1、如何掌握MyBatis的工作原理？关于MyBatis的工作原理，网上的文章是汗牛充栋，但是站长觉得，要结合JDBC来理解MyBatis的工作原理往往才能更透彻。我们知道，JDBC有四个核心对象：（1）DriverManager，用于注册数据库连接（2）Connection，与数据库连接对象（3）Statement/PrepareStatement，操作数据库SQL语句的对象（4）ResultSet，结果集或一张虚拟表而MyBatis也有四大核心对象：（1）SqlSession对象，该对象中包含了执行SQL语句的所有方法【1】。类似于JDBC里面的Connection 【2】。（2）Executor接口，它将根据SqlSession传递的参数动态地生成需要执行的SQL语句，同时负责查询缓存的维护。类似于JDBC里面的Statement/PrepareStatement。（3）MappedStatement对象，该对象是对映射SQL的封装，用于存储要映射的SQL语句的id、参数等信息。（4）ResultHandler对象，用于对返回的结果进行处理，最终得到自己想要的数据格式或类型。可以自定义返回类型。2、MyBatis的工作原理以及核心流程详解MyBatis的工作原理如下图所示：上面中流程就是MyBatis内部核心流程，每一步流程的详细说明如下文所述：（1）读取MyBatis的配置文件。mybatis-config.xml为MyBatis的全局配置文件，用于配置数据库连接信息。（2）加载映射文件。映射文件即SQL映射文件，该文件中配置了操作数据库的SQL语句，需要在MyBatis配置文件mybatis-config.xml中加载。mybatis-config.xml 文件可以加载多个映射文件，每个文件对应数据库中的一张表。（3）构造会话工厂。通过MyBatis的环境配置信息构建会话工厂SqlSessionFactory。（4）创建会话对象。由会话工厂创建SqlSession对象，该对象中包含了执行SQL语句的所有方法。（5）Executor执行器。MyBatis底层定义了一个Executor接口来操作数据库，它将根据SqlSession传递的参数动态地生成需要执行的SQL语句，同时负责查询缓存的维护。（6）MappedStatement对象。在Executor接口的执行方法中有一个MappedStatement类型的参数，该参数是对映射信息的封装，用于存储要映射的SQL语句的id、参数等信息。（7）输入参数映射。输入参数类型可以是Map、List等集合类型，也可以是基本数据类型和POJO类型。输入参数映射过程类似于JDBC对preparedStatement对象设置参数的过程。（8）输出结果映射。输出结果类型可以是Map、List等集合类型，也可以是基本数据类型和POJO类型。输出结果映射过程类似于JDBC对结果集的解析过程。

Spring之SpringCloud 组件介绍
type: item
date: 2023-04-19T08:23:00+00:00
description: 一、微服务架构中常见概念服务注册与服务发现服务注册: 服务提供者将所提供服务的信息(服务器IP和端口、服务访问协议等) 注册/登记到注册中心。服务发现: 服务消费者能够从注册中心获取到较为实时的服务列表，然后根究一定 的策略选择一个服务访问。负载均衡负载均衡即将请求压力分配到多个服务器(应用服务器、数据库服务器等)，以此来提高服务的性能、可靠性。熔断即断路保护。微服务架构中，如果下游服务因访问压力过大而响应变慢或失败，上游服务为了保护系统整体可用性，可以暂时切断对下游服务的调用。这种牺牲局部，保全整体的措施就叫做熔断。链路追踪微服务架构越发流行，一个项目往往拆分成很多个服务，那么一次请求就需要涉及到很多个服务。不同的微服务可能是由不同的团队开发、可能使用不同的编程语言实现、整个项目也有可能部署在了很多服务器上(甚至百台、千台)横跨多个不同的数据中心。所谓链路追踪，就是对一次请求涉及的很多个服务链路进行日志记录、性能监控。API 网关API请求调用统一接入API网关层， 由网关转发请求。API网关更专注在安全、路由、流量等问题的处理上(微服务团队 专注于处理业务逻辑即可)，它的功能：统一接入(路由)安全防护(统一鉴权，负责网关访问身份认证验证，与“访问认证中心”通信，实际认证业务逻辑交移“访问认证中心”处理)黑白名单(实现通过IP地址控制禁止访问网关功能，控制访问)协议适配(实现通信协议校验、适配转换的功能)流量管控(限流)⻓短链接支持容错能力(负载均衡)二、常见的组件2.1 服务注册中心组件 EurekaEureka 交互流程及原理Eureka 包含两个组件:Eureka Server 和 Eureka Client，Eureka Client是一个 Java客户端，用于简化与Eureka Server的交互；Eureka Server提供服务发现的能力，各个微服务启动时，会通过Eureka Client向Eureka Server 进行注册自己 的信息(例如网络信息)，Eureka Server会存储该服务的信息。图中us-east-1c、us-east-1d，us-east-1e代表不同的区也就是不同的机房图中每一个Eureka Server都是一个集群。图中Application Service作为服务提供者向Eureka Server中注册服务， Eureka Server接受到注册事件会在集群和分区中进行数据同步，Application Client作为消费端(服务消费者)可以从Eureka Server中获取到服务注册信 息，进行服务调用。微服务启动后，会周期性地向Eureka Server发送心跳(默认周期为30秒) 以续约自己的信息Eureka Server在一定时间内没有接收到某个微服务节点的心跳，Eureka Server将会注销该微服务节点(默认90秒)每个Eureka Server同时也是Eureka Client，多个Eureka Server之间通过复 制的方式完成服务注册列表的同步Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节 点都宕掉，服务消费者依然可以使用缓存中的信息找到服务提供者Eureka通过心跳检测、健康检查和客户端缓存等机制，提高系统的灵活性、可 伸缩性和可用性。Eureka集群：Eureka的 元数据 有两种：标准元数据和自定义元数据。标准元数据: 主机名、IP地址、端口号等信息，这些信息都会被发布在服务注册表中，用于服务之间的调用。自定义元数据: 可以使用eureka.instance.metadata-map配置，符合KEY/VALUE的 存储格式。这 些元数据可以在远程客户端中访问。2.2 Ribbon负载均衡负载均衡一般分为服务器端负载均衡和客户端负载均衡 所谓服务器端负载均衡，比如Nginx、F5这些，请求到达服务器之后由这些负载均衡器根据一定的算法将请求路由到目标服务器处理。所谓客户端负载均衡，比如我们要说的Ribbon，服务消费者客户端会有一个服务器 地址列表，调用方在请求前通过一定的负载均衡算法选择一个服务器进行访问，负载均衡算法的执行是在请求客户端进行。Ribbon是Netflix发布的负载均衡器。Eureka一般配合Ribbon进行使用，Ribbon利 用从Eureka中读取到服务信息，在调用服务提供者提供的服务时，会根据一定的算法进行负载。2.3 Hystrix熔断器Hystrix(豪猪)，宣言“defend your app”是由Netflix开源的一个 延迟和容错库，用于隔离访问远程系统、服务或者第三方库，防止级联失败，从而 提升系统的可用性与容错性。Hystrix主要通过以下几点实现延迟和容错。包…

Spring之SpringBoot底层源码解析
type: item
date: 2023-04-19T08:20:00+00:00
description: 一、启动流程二、自动配置参考https://blog.csdn.net/weixin_43811057/article/details/130183835https://www.bilibili.com/video/BV1NY411P7VX/