<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[张三李四王五老六]]></title><description><![CDATA[张三李四王五老六]]></description><link>https://blog.youkuaiyun.com/upstream480</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; upstream480]]></copyright><item><title><![CDATA[GO 中的 init 函数]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/128994361</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/128994361</guid><author>upstream480</author><pubDate>Sun, 12 Feb 2023 14:57:52 +0800</pubDate><description><![CDATA[go语言中有一个非常神奇的函数init,它可以在所有程序执行开始前被执行，并且每个package下面可以存在多个init函数，我们一起来看看这个奇怪的init函数。]]></description><category></category></item><item><title><![CDATA[全链路追踪 jaeger]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/128602990</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/128602990</guid><author>upstream480</author><pubDate>Tue, 24 Jan 2023 00:25:34 +0800</pubDate><description><![CDATA[Jaeger是Uber开发并开源的一款分布式追踪系统，兼容分布式跟踪信息传递分布式事务监控问题分析服务依赖性分析性能优化。]]></description><category></category></item><item><title><![CDATA[全链路追踪之OpenTracing]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/128602157</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/128602157</guid><author>upstream480</author><pubDate>Sun, 08 Jan 2023 16:59:08 +0800</pubDate><description><![CDATA[现在的大多数互联网服务，基本都是用复杂，大规模分布式集群来实现，微服务化，这些服务模块分布在不同的机器，不同的数据中心，由不同团队，语言开发而成。]]></description><category></category></item><item><title><![CDATA[redis 事务]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/128436008</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/128436008</guid><author>upstream480</author><pubDate>Sun, 25 Dec 2022 16:21:56 +0800</pubDate><description><![CDATA[在事务执行过程，会按照顺序串行化执行队列中的命令，其他客户端提交的命令请求不会插入到事务执行命令序列中。可以监控一个或多个键，如果在事务执行之前，被监视的key被其他命令修改（或删除），则事务被打断（类似乐观锁），之后的事务就不会执行，监控一直持续到。可以保证脚本内的命令一次性、按顺序地执行，其同时也不提供事务运行错误的回滚，执行过程中如果部分命令运行错误，剩下的命令还是会继续运行完。是单进程程序，并且它保证在执行事务时，不会对事务进行中断，事务可以运行直到执行完所有事务队列中的命令为止。]]></description><category></category></item><item><title><![CDATA[http 库的服务端实现]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/128429477</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/128429477</guid><author>upstream480</author><pubDate>Sat, 24 Dec 2022 17:21:16 +0800</pubDate><description><![CDATA[上两篇文章介绍了 http 客户端的实现，这篇文章看一下服务端的实现服务端的代码看主逻辑主要是看两部分，一个是注册处理器，标准库使用map进行存储，本质是一个静态索引，同时维护了一个切片，用来做前缀匹配，只要以/结尾的，都会在切片中存储；]]></description><category></category></item><item><title><![CDATA[net/http 库的客户端实现(下)]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/128429174</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/128429174</guid><author>upstream480</author><pubDate>Sat, 24 Dec 2022 16:06:40 +0800</pubDate><description><![CDATA[上一篇文章我们讲了net/http库客户端 request 的构建，接下来继续讲构建HTTP请求之后的处理操作]]></description><category></category></item><item><title><![CDATA[net/http 库的客户端实现(上)]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/128354324</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/128354324</guid><author>upstream480</author><pubDate>Sat, 17 Dec 2022 17:20:02 +0800</pubDate><description><![CDATA[Go语言标准库net/http是一个非常强大的标准库，使得构建HTTP请求和编写Web服务器的工作变得非常简单。我们来看看是他是如何实现客户端和服务端的。]]></description><category></category></item><item><title><![CDATA[OAuth2.0的四种授权方式]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/128275161</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/128275161</guid><author>upstream480</author><pubDate>Sun, 11 Dec 2022 15:31:26 +0800</pubDate><description><![CDATA[OAuth简单理解就是一种授权机制，它是在客户端和资源所有者之间的授权层，用来分离两种不同的角色。在资源所有者同意并向客户端颁发令牌后，客户端携带令牌可以访问资源所有者的资源。]]></description><category></category></item><item><title><![CDATA[MQTT协议]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/128270049</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/128270049</guid><author>upstream480</author><pubDate>Sat, 10 Dec 2022 22:31:01 +0800</pubDate><description><![CDATA[MQTT是一种基于发布/订阅模式的轻量级通讯协议，通过订阅相应的主题来获取消息，是物联网（Internet of Thing）中的一个标准传输协议。该协议将消息的发布者（publisher）与订阅者（subscriber）进行分离，因此可以在不可靠的网络环境中，为远程连接的设备提供可靠的消息服务]]></description><category></category></item><item><title><![CDATA[gin 统一响应结果]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/128168125</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/128168125</guid><author>upstream480</author><pubDate>Sat, 03 Dec 2022 23:35:57 +0800</pubDate><description><![CDATA[使用 gin 框架，编写 api 接口时，需要定义返回格式,这种方法有一个弊端，每次返回都需要写这个结构
封装统一结果
定义统一结构体

使用

这样在每个HandlerFunc 方法只需要使用 result 下面的方法即可，统一管理，还可以定义统一的错误码]]></description><category></category></item><item><title><![CDATA[golang的new和make]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/128057908</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/128057908</guid><author>upstream480</author><pubDate>Sat, 26 Nov 2022 23:49:52 +0800</pubDate><description><![CDATA[string 的零值是"",int 的零值是0，引用类型的零值是nil。前面两种类型可以直接使用，但如果把它改成指针，就会报错]]></description><category></category></item><item><title><![CDATA[@Transactional注解为何会失效]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/127955090</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/127955090</guid><author>upstream480</author><pubDate>Sun, 20 Nov 2022 22:46:35 +0800</pubDate><description><![CDATA[使用 @Transactional 注解能保证方法内多个数据库操作要么同时成功、要么同时失败。但是有很多细节需要注意，不然@Transactional可能会失效。]]></description><category></category></item><item><title><![CDATA[声明式事务@Transactional]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/127941345</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/127941345</guid><author>upstream480</author><pubDate>Sat, 19 Nov 2022 20:46:43 +0800</pubDate><description><![CDATA[事务管理在 Web 系统开发中是非常重要的，可以在一定程度上保证数据的一致性。Spring提供了非常优秀的事务管理机制，主要分为编程式事务和声明式事务。]]></description><category></category></item><item><title><![CDATA[解决跨越的几种方式]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/127820849</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/127820849</guid><author>upstream480</author><pubDate>Sun, 13 Nov 2022 13:59:07 +0800</pubDate><description><![CDATA[域 的定义：协议 + 域名 + 端口。
三者完全相同则为同域，反之有其一不同均为不同域，
当前发起请求的 域 和请求指向的 域 属于不同域时，该次请求称之为跨域请求。]]></description><category></category></item><item><title><![CDATA[事件总线 EventBus]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/127820615</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/127820615</guid><author>upstream480</author><pubDate>Sat, 12 Nov 2022 15:18:07 +0800</pubDate><description><![CDATA[EventBus 顾名思义，事件总线，是一个轻量级的发布 - 订阅模式的应用模式。相比于 MQ 更加简洁，轻量，它可以在一个小系统模块内部使用EventBus允许组件之间通过发布 - 订阅进行通信，而不需要组件之间显示的注册。它专门设计为了代替使用显示注册的传统的 Java 进程内事件分发。它不是通用的发布-订阅系统，也不是用于进程间通信的。]]></description><category></category></item><item><title><![CDATA[Golang 数据结构之 Slice (三)]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/124640531</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/124640531</guid><author>upstream480</author><pubDate>Sun, 08 May 2022 15:36:14 +0800</pubDate><description><![CDATA[前言
Golang 数据结构之 Slice (二)
上一篇文章介绍了一下扩容的基本情况，这一篇文章分析要 growslice 函数的源码
源码
我们看看 growslice函数的源码，可以分成三部分：
func growslice(et *_type, old slice, cap int) slice {
	if raceenabled {
		callerpc := getcallerpc(unsafe.Pointer(&amp;et))
		racereadrangepc(old.array, uin]]></description><category></category></item><item><title><![CDATA[Golang 数据结构之 Slice (二)]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/124639529</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/124639529</guid><author>upstream480</author><pubDate>Sat, 07 May 2022 22:12:13 +0800</pubDate><description><![CDATA[前言
Golang 数据结构之 Slice (一)
上一篇文章写了Slice的基本数据结构，而且提到了Slice可以自动扩容，这篇文章就简单看看Slice是怎么样扩容的。
append函数
说扩容之前，不得不说一下 Slice 内置的 append 函数，这是一个用于向slice 追加元素的函数
func main(){
		var nums []int
		for i := 0; i &lt; 10; i++ {
			nums = append(nums, i)
		}
		fmt.Printf("nu]]></description><category></category></item><item><title><![CDATA[Golang 数据结构之 Slice (一)]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/124575040</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/124575040</guid><author>upstream480</author><pubDate>Wed, 04 May 2022 22:21:49 +0800</pubDate><description><![CDATA[Golang 数据结构之 Slice
前言
Slice（切片）是抽象在 Array（数组）之上的特殊的数据类型类型，在了解slice之前需要先了解一下Array的情况。
Array 数组
Array数组就是 Golang 的基本数据类型中的数字，是一种顺序存储结构。
用法
func main() {
	nums := [4]int{}
	nums[0] = 1
	nums[2] = 3

	fmt.Printf("nums: %v\n", nums)
	fmt.Printf("nums[2]: %d\n",]]></description><category></category></item><item><title><![CDATA[什么是自旋锁]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/122272332</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/122272332</guid><author>upstream480</author><pubDate>Sun, 02 Jan 2022 21:28:58 +0800</pubDate><description><![CDATA[前言
阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成，这种状态转换需要耗费处理器时间。如果同步代码块中的内容过于简单，状态转换消耗的时间有可能比用户代码执行的时间还要长。
自旋锁
在有些场景中，同步资源的锁定时间很短，为了这一小段时间去切换线程，线程挂起和恢复现场的花费可能会让系统得不偿失。
如果机器有多个CPU核心，能够让两个或以上的线程同时并行执行，我们就可以让后面那个请求锁的线程不放弃CPU的执行时间，看看持有锁的线程是否很快就会释放锁。
为了让当前线程“稍等一下”，我们需让当前线程进行自]]></description><category></category></item><item><title><![CDATA[悲观锁 VS 乐观锁]]></title><link>https://blog.youkuaiyun.com/upstream480/article/details/122154672</link><guid>https://blog.youkuaiyun.com/upstream480/article/details/122154672</guid><author>upstream480</author><pubDate>Sun, 26 Dec 2021 15:01:18 +0800</pubDate><description><![CDATA[前言
Java中有很多锁，每种锁因其特性的不同，在适当的场景下的效率也有很大的差别。今天我们对比一下乐观锁和悲观锁，看看他们有什么不同和相同。
乐观锁与悲观锁是一种广义上的概念，体现了看待线程同步的不同角度。在Java和数据库中都有比较广泛的应用。
悲观锁
对于同一个数据的并发操作，悲观锁认为自己在使用数据的时候一定有别的线程来修改数据，因此在获取数据的时候会先加锁，确保数据不会被别的线程修改。Java中，synchronized关键字和Lock的实现类都是悲观锁。


悲观锁调用方式
分别是 synchr]]></description><category></category></item></channel></rss>