<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[blackball1998的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/blackball1998</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; blackball1998]]></copyright><item><title><![CDATA[Docker命令速查]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/126276493</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/126276493</guid><author>blackball1998</author><pubDate>Wed, 10 Aug 2022 23:36:39 +0800</pubDate><description><![CDATA[Docker命令速查]]></description><category></category></item><item><title><![CDATA[Dubbo降级&容错机制]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/119065770</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/119065770</guid><author>blackball1998</author><pubDate>Sat, 24 Jul 2021 23:32:13 +0800</pubDate><description><![CDATA[Dubbo降级&amp;容错机制
在分布式环境中，由于所有的服务不在同一台服务器中，就涉及到服务之间的调用，而远程调用涉及到网络，网络是不可靠的，这就导致了有时候远程调用会失败，这时候就需要容错机制
而服务降级机制，是指在流量特别大的情况下，我们主动关闭一些不重要的服务，将资源向核心服务倾斜，被关闭的服务就会做服务降级
服务降级
服务降级就是我们将一些不重要的服务屏蔽掉，当有别的服务对被降级的服务发起远程调用时，不发起调用，而是执行本地的服务降级逻辑
首先我们构建一个提供者服务，用于获取用户的地址
@Ser]]></description><category></category></item><item><title><![CDATA[Dubbo常用配置]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/119065736</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/119065736</guid><author>blackball1998</author><pubDate>Sat, 24 Jul 2021 23:28:16 +0800</pubDate><description><![CDATA[Dubbo常用配置
使用Dubbo作为项目的RPC框架，可以根据项目实际需要，选择Dubbo提供的自定义配置，本文介绍了Dubbo常用的配置选项
启动时检查
默认情况下，消费者服务启动时，会检查注册中心是否有启用的提供者服务，如果没有，会造成检查不通过，启动失败

有时候在开发过程中，需要绕过启动检查，可以使用check属性，将值设置为false既可
@Service
public class OrderServiceImpl implements OrderService {

    @DubboRef]]></description><category></category></item><item><title><![CDATA[Dubbo负载均衡策略]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118465252</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118465252</guid><author>blackball1998</author><pubDate>Sun, 04 Jul 2021 18:14:47 +0800</pubDate><description><![CDATA[Dubbo负载均衡策略
在分布式环境中，一般都有多个提供者服务，形成一个集群，在多个提供者的环境下，每次调用服务使用哪个提供者，这就涉及分布式的负载均衡策略，Dubbo为我们提供了四种负载均衡策略，分别是随机，轮询，最小活跃以及一致性Hash
为了测试，我们创建一个服务提供者，用于查询用户地址，并且记录是哪个提供者，以及被调用的次数和调用的参数，在测试的时候，启动多个提供者来测试不同负载均衡策略下的调用效果
@Service
@DubboService
@Slf4j
public class UserSer]]></description><category></category></item><item><title><![CDATA[搭建Dubbo监控面板]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118446624</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118446624</guid><author>blackball1998</author><pubDate>Sat, 03 Jul 2021 23:16:49 +0800</pubDate><description><![CDATA[搭建Dubbo监控面板
Dubbo官方为我们提供了一个监控中心dubbo-admin，可以让我们在使用Dubbo时，监控和控制服务的状态，使用监控面板更方便地管理服务，不过这个监控中心是一个单独的项目，需要我们下载并启动
首先从github上将项目克隆到本地，地址如下：
dubbo-admin项目地址
启动后端服务
新版dubbo-admin项目是一个前后端分离的项目，需要分别启动前端和后端项目，启动后端项目之前前请确保Zookeeper正在运行
打开项目下的dubbo-admin-server项目，这就是]]></description><category></category></item><item><title><![CDATA[Dubbo简单体验]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118446585</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118446585</guid><author>blackball1998</author><pubDate>Sat, 03 Jul 2021 23:13:45 +0800</pubDate><description><![CDATA[Dubbo简单体验
Dubbo是一款高性能的RPC框架，他主要实现了在分布式系统中，服务之间的相互调用，也支持一些负载均衡策略和限流降级策略。由于Dubbo在通信协议层使用自有的二进制流协议传输，因此效率比基于Http协议的RPC框架效率要高，也因此Dubbo成为了现在分布式系统领域中炙手可热的一个框架
在使用Dubbo之前，需要先介绍一下分布式系统中的几个概念
以下是Dubbo官网中的一张图片，可以看到，在分布式系统中，一个服务要去远程调用另一个服务，则调用方为“消费者”，被调用方为“提供者”
在分布式系]]></description><category></category></item><item><title><![CDATA[事务的传播机制]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118228986</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118228986</guid><author>blackball1998</author><pubDate>Fri, 25 Jun 2021 21:28:12 +0800</pubDate><description><![CDATA[事务的传播机制
事务的传播行为就是在两个都启用了事务的方法进行嵌套调用时，外层事务和内层事务的执行动作，Spring支持七种传播方式，他们的效果如下：

REQUIRED：如果有外层事务，则加入这个事务，否则开启一个新的事务
SUPPORTS：如果有外层事务，则加入这个事务，否则就以非事务方式执行
MANDATORY：如果有外层事务，则加入这个事务，否则抛出异常
REQUIRES_NEW：开启一个独立的新事务执行
NOT_SUPPORTED：方法不应该以事务方法执行，如果有外层事务，就以非事务方式执行
NE]]></description><category></category></item><item><title><![CDATA[声明式事务]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118228964</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118228964</guid><author>blackball1998</author><pubDate>Fri, 25 Jun 2021 21:27:13 +0800</pubDate><description><![CDATA[声明式事务
事务是描述对数据库的一组操作，比如在转账业务中，A向B转了一笔钱，那么从A的账户中扣款和把钱打入B的账户这两个数据操作就应该放在一个事务中，不允许只单独执行其中一个操作，如果在事务执行过程中有错误产生，则整个事务中的操作需要全部回退。关于事务可以了解一下事务的ACID特性
Spring对事务做了支持，可以用注解标记一个方法中的操作为一组事务，这就是Spring声明式事务
为了测试，我们创建一个Service类，定义一个新增操作的方法，这个方法一定会产生一个异常，来模拟业务产生错误的情景
@Ser]]></description><category></category></item><item><title><![CDATA[整合Swagger]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118228921</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118228921</guid><author>blackball1998</author><pubDate>Fri, 25 Jun 2021 21:24:15 +0800</pubDate><description><![CDATA[整合Swagger
在现在的web开发中，前后端分离的开发模式大行其道，前端负责页面渲染，并发送请求到后端服务器请求数据，后端负责数据访问和处理，然后返回数据给前端
在前后端开发的模式中，接口的定义在协同开发中就非常重要，前端开发人员需要清晰地知道后端接口的用途，需要的参数和返回的数据，因此在开发中需要一份接口文档。Swagger是一款流行的Api框架，他可以定义Api接口的参数和返回值，并且支持同步更新和在线调试，解决了这个问题
基本使用
使用Swagger，需要导入Swagger的starter依赖，本]]></description><category></category></item><item><title><![CDATA[Spring Boot发送邮件]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118163454</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118163454</guid><author>blackball1998</author><pubDate>Wed, 23 Jun 2021 22:00:47 +0800</pubDate><description><![CDATA[发送邮件
在web开发中，发送邮件是一个很常用的功能，Spring Boot也集成了发送邮件的功能
基本使用
使用Spring Boot的发送邮件功能，需要导入邮件的starter依赖
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-mail&lt;/artifactId&gt;
&lt;/dependency&gt]]></description><category></category></item><item><title><![CDATA[Spring Boot异步任务]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118096890</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118096890</guid><author>blackball1998</author><pubDate>Mon, 21 Jun 2021 23:26:32 +0800</pubDate><description><![CDATA[异步任务
在业务开发中，有一些业务流程耗时会比较长，这样会使前端发送请求后一直等待响应，但是有一些业务逻辑不需要有很强的及时性，例如发短信，发邮件等等，这些业务逻辑由于要进行网络通信，耗时比较长，却不需要在真正完成业务逻辑之后才响应给前端，对于这种业务场景我们可以使用异步任务机制，将响应立即返回给前端，然后开启异步线程执行慢业务逻辑，这样会大大提升用户体验
使用多线程的方式可以实现异步的功能，但是线程的编写比较繁琐，Spring Boot帮我们封装了异步任务的功能，让我们可以简单地实现异步任务
首先我们来模]]></description><category></category></item><item><title><![CDATA[整合Shiro]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118077308</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118077308</guid><author>blackball1998</author><pubDate>Sun, 20 Jun 2021 23:55:02 +0800</pubDate><description><![CDATA[整合Shiro
Shiro是一款开源的轻量的权限管理框架，他能实现用户的认证和授权功能，也可以实现密码加密功能
基本使用
使用Shiro，首先需要导入starter依赖
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.shiro&lt;/groupId&gt;
    &lt;artifactId&gt;shiro-spring-boot-web-starter&lt;/artifactId&gt;
    &lt;version&gt;1.7.0&lt;/]]></description><category></category></item><item><title><![CDATA[Spring Boot定时任务]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118077302</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118077302</guid><author>blackball1998</author><pubDate>Sun, 20 Jun 2021 23:51:10 +0800</pubDate><description><![CDATA[定时任务
在开发中，我们经常会用到定时任务的功能，例如定时同步数据，定时发送邮件等等，Spring Boot也提供了定时任务的功能
基本使用
要使用定时任务，首先需要开启项目的定时任务功能，只需要在启动类或者配置类中添加@EnableScheduling注解
@EnableScheduling
@SpringBootApplication
public class SpringDemoApplication {

    public static void main(String[] args) {
  ]]></description><category></category></item><item><title><![CDATA[JSR303参数校验]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118077271</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118077271</guid><author>blackball1998</author><pubDate>Sun, 20 Jun 2021 23:49:25 +0800</pubDate><description><![CDATA[JSR303参数校验
在进行web开发时，对于前端发送的参数，需要进行合法性验证，虽然前端也会进行验证，但是用户仍然可以使用postman等工具或者手动拼接url等方式绕过验证，因此后端也需要验证
要验证参数，可以使用JSR303校验机制，他适用于大多数验证场景
基本使用
使用JSR303校验，首先需要导入对应的starter
&lt;dependency&gt;
	&lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
	&lt;artifactId]]></description><category></category></item><item><title><![CDATA[整合Spring Session]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118077239</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118077239</guid><author>blackball1998</author><pubDate>Sun, 20 Jun 2021 23:45:57 +0800</pubDate><description><![CDATA[整合Spring Session
在web开发中，我们会使用Session来存放当前登录用户的信息，不过这么做有许多弊端，比如Session底层是一个存放在本地内存的map集合，这使得在分布式集群环境下无法在集群内的多台机器中共享Session，而且登录的用户一旦多，本地存放Session的方式也会使得内存资源紧张，因此我们可以使用Redis来存放Session
Spring Session是Spring官方提供的一个用于解决分布式Session的框架，他也支持使用Redis来存放Session，而且使用简]]></description><category></category></item><item><title><![CDATA[整合Spring Cache]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118077219</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118077219</guid><author>blackball1998</author><pubDate>Sun, 20 Jun 2021 23:43:07 +0800</pubDate><description><![CDATA[整合Spring Cache
Spring Cache是Spring框架为我们提供的一个缓存抽象层，无论我们使用一个map作为本地缓存，还是EnCache和Redis这种专业的缓存，都可以使用Spring Cache方便地集成，使用起来也很简单，使用注解在业务逻辑方法上标注，即可完成缓存操作，而不用将缓存操作和业务代码耦合在一起
基本使用
使用Spring Cache，首先需要导入对应的starter依赖
&lt;dependency&gt;
    &lt;groupId&gt;org.springfra]]></description><category></category></item><item><title><![CDATA[整合Redis]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118077196</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118077196</guid><author>blackball1998</author><pubDate>Sun, 20 Jun 2021 23:41:00 +0800</pubDate><description><![CDATA[整合Redis
Redis是一款高性能的非关系性数据库，他基于内存存储数据，并且在底层做了数据结构优化，读写的效率都非常高，在开发中往往作为数据缓存的首选。在使用Spring Boot开发web应用时，可以使用Spring Boot官方提供的starter轻松整合Redis到项目中
导入依赖
使用Redis，首先需要导入对应的starter
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &]]></description><category></category></item><item><title><![CDATA[单元测试流程控制]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118077155</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118077155</guid><author>blackball1998</author><pubDate>Sun, 20 Jun 2021 23:38:08 +0800</pubDate><description><![CDATA[单元测试流程控制
Spring Boot默认使用JUnit5作为测试框架，而JUnit5提供了丰富的API和注解，方便我们对测试的流程做控制
断言
断言机制就是在测试方法中编写判断逻辑，如果满足逻辑则测试成功，不满足则测试失败，简单的断言有以下几种：

assertEquals：判断两个对象或两个原始类型是否相等
assertNotEquals：判断两个对象或两个原始类型是否不相等
assertSame：判断两个对象引用是否指向同一个对象
assertNotSame：判断两个对象引用是否指向不同的对象
as]]></description><category></category></item><item><title><![CDATA[Spring Boot单元测试]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118077133</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118077133</guid><author>blackball1998</author><pubDate>Sun, 20 Jun 2021 23:34:28 +0800</pubDate><description><![CDATA[单元测试
使用Spring Boot进行开发，就会涉及到做单元测试，而Spring Boot帮我们集成了单元测试框架JUnit5，在我们创建完一个Spring Boot项目之后，可以直接使用Spring Boot整合的单元测试功能
基本使用
使用单元测试功能，需要以下依赖
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starte]]></description><category></category></item><item><title><![CDATA[Spring Boot打印日志]]></title><link>https://blog.youkuaiyun.com/blackball1998/article/details/118077087</link><guid>https://blog.youkuaiyun.com/blackball1998/article/details/118077087</guid><author>blackball1998</author><pubDate>Sun, 20 Jun 2021 23:31:35 +0800</pubDate><description><![CDATA[打印日志
Spring Boot默认使用Slf4j日志门面和Logback日志实现，关于日志门面和日志实现的关系，可以使用以下Slf4j官网的这张图表示，日志门面是日志实现的抽象层，我们调用日志的接口时应该调用日志门面的接口

但是有时候一些框架的日志不是用slf4j的规范，这时候可以使用桥接jar包去转换，在Spring Boot整合其他框架的时候也是这么实现的，桥接的原理如下图所示

输出日志
在Spring Boot中打印日志，可以使用Spring Boot默认的Slf4j接口，使用日志工厂类Logg]]></description><category></category></item></channel></rss>