<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[copymaster]]></title><description><![CDATA[stay hungry stay foolish]]></description><link>https://blog.youkuaiyun.com/blogsun</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; blogsun]]></copyright><item><title><![CDATA[grpc使用]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102913402</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102913402</guid><author>blogsun</author><pubDate>Tue, 05 Nov 2019 12:20:35 +0800</pubDate><description><![CDATA[使用grpc和protobuf实现rpc通信的例子
创建工程
mkdir grpc_test
cd grpc_test
go mod init

//使用github的grpc替换gp的grpc  
go mod edit -replace=google.golang.org/grpc=github.com/grpc/grpc-go@latest
go mod edit -replace=gola...]]></description><category></category></item><item><title><![CDATA[etcd服务发现]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102861648</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102861648</guid><author>blogsun</author><pubDate>Fri, 01 Nov 2019 17:23:31 +0800</pubDate><description><![CDATA[原理
etcd实现服务发现和注册，使用的是kv存储、租约、watch.
向etcd 注册 该服务（其实就是 存一个值）然后向etcd 发送心跳，当etcd 没有检测到心跳就会 把这个键值对 删了(这整个动作是etcd里的租约模式)，网关那边 就只需要 watch 这个 key ，就能够知道 所有服务的所有动态了.
注册的时候可以使用前缀这样在watch的时候可以watch所有的服务器.
服务注册
...]]></description><category></category></item><item><title><![CDATA[pitaya框架中etcd实现服务发现源码注释]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102860565</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102860565</guid><author>blogsun</author><pubDate>Fri, 01 Nov 2019 16:40:32 +0800</pubDate><description><![CDATA[package cluster

import (
	"context"
	"encoding/json"
	"fmt"
	"strings"
	"sync"
	"time"

	"github.com/coreos/etcd/clientv3"
	"github.com/coreos/etcd/clientv3/namespace"
	"github.com/topfreegames/pita...]]></description><category></category></item><item><title><![CDATA[etcd API使用]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102860317</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102860317</guid><author>blogsun</author><pubDate>Fri, 01 Nov 2019 16:30:49 +0800</pubDate><description><![CDATA[连接客户端
访问etcd首先要创建client，它需要传入一个Config配置.
Endpoints：etcd的多个节点服务地址。
DialTimeout：创建client的首次连接超时时间，这里传了5秒，如果5秒都没有连接成功就会返回err；一旦client创建成功，不用再关心后续底层连接的状态了，client内部会重连。
    cli,err := clientv3.New(clientv3...]]></description><category></category></item><item><title><![CDATA[etcd快速入门]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102855184</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102855184</guid><author>blogsun</author><pubDate>Fri, 01 Nov 2019 12:16:09 +0800</pubDate><description><![CDATA[安装
下载地址：https://github.com/etcd-io/etcd/releases
下载完成解压后，目录中有两个二进制文件， etcd以及 etcdctl。其中 etcd就是运行etcd服务的二进制文件， etcdctl是官方提供的命令行etcd客户端，使用 etcdctl可以在命令行中访问etcd服务。
查看etcd版本 ./etcd --version
运行
单点启动
查看启动帮...]]></description><category></category></item><item><title><![CDATA[golang中的坑]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102838372</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102838372</guid><author>blogsun</author><pubDate>Thu, 31 Oct 2019 16:41:41 +0800</pubDate><description><![CDATA[初级篇：1-34

左大括号 { 一般不能单独放一行
在其他大多数语言中，{ 的位置你自行决定。Go 比较特别，遵守分号注入规则（automatic semicolon injection）：编译器会在每行代码尾部特定分隔符后加 ; 来分隔多条语句，比如会在 ) 后加分号：

// 错误示例
func main()					
{
	println("hello world")
}

// 等效于
...]]></description><category></category></item><item><title><![CDATA[go语言中的换行和分号]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102837951</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102837951</guid><author>blogsun</author><pubDate>Thu, 31 Oct 2019 15:02:46 +0800</pubDate><description><![CDATA[golang中为了在语言层面实现代码规范，会在一些地方自动添加分号
当输入被断开为标记时，如果行末标记为:
1. 一个标识符
2. 一个整数、浮点数、虚数、字符或字符串文字
3. 关键字break、continue、fallthrough或return中的一个
4… 运算符和分隔符++、–、)、]或}中的一个
则分号将被自动插入到标记流中非空白行的末尾.
如下代码, add是正确的，参数换行因为a...]]></description><category></category></item><item><title><![CDATA[go跨平台编译]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102837826</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102837826</guid><author>blogsun</author><pubDate>Thu, 31 Oct 2019 14:54:16 +0800</pubDate><description><![CDATA[Mac 下编译 Linux 和 Windows 64位可执行程序
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build main.go
Linux 下编译 Mac 和 Windows 64位可执行程序
CGO_ENABLED=0 GOOS=dar...]]></description><category></category></item><item><title><![CDATA[defer和return]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102834526</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102834526</guid><author>blogsun</author><pubDate>Thu, 31 Oct 2019 11:23:50 +0800</pubDate><description><![CDATA[多个defer的执行顺序为“后进先出”
defer、return、返回值的执行逻辑：

return最先执行，return负责将结果写入返回值中；
接着defer开始执行一些收尾工作；
最后函数携带当前返回值退出

代码验证
package main
 
import "fmt"
 
func main()  {
    fmt.Println("func1 return: ", func1())...]]></description><category></category></item><item><title><![CDATA[etcd租约及监听key]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102823555</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102823555</guid><author>blogsun</author><pubDate>Wed, 30 Oct 2019 17:27:47 +0800</pubDate><description><![CDATA[package main

import (
	"context"
	"log"
	"time"

	"go.etcd.io/etcd/clientv3"
)

func main() {
	var conf = clientv3.Config{
		Endpoints:   []string{"127.0.0.1:2380"},
		DialTimeout: 5 * time.Second,
	...]]></description><category></category></item><item><title><![CDATA[etcd命令和API]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102822332</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102822332</guid><author>blogsun</author><pubDate>Wed, 30 Oct 2019 16:44:46 +0800</pubDate><description><![CDATA[命令
启动
./etcdctl
使用etcd v3
export ETCDCTL_API=3 set ETCDCTL_API=3
查询集群成员
./etcdctl member list
查询节点状态
./etcdctl --endpoints localhost:2379 endpoint status --write-out="table"
监听一个key
./etcdctl watch /k...]]></description><category></category></item><item><title><![CDATA[开源游戏服务器你中意哪款？]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102680360</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102680360</guid><author>blogsun</author><pubDate>Tue, 22 Oct 2019 12:52:51 +0800</pubDate><description><![CDATA[有哪些开源游戏服务器框架，值得学习呢。基于node.js 、java、C#、golang 、c++、python 等技术栈有各种各样的游戏框架。 本文收集一些比较常用的 github上star和fork有一定数量的较为完整的框架
skynet
云风大神的框架这个基本上使用很多的， c+lua的框架。skynet只能算是网络层的轮子但是因为其众多的用户还是很不错的
https://github.co...]]></description><category></category></item><item><title><![CDATA[Context解析]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102630359</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102630359</guid><author>blogsun</author><pubDate>Fri, 18 Oct 2019 18:48:53 +0800</pubDate><description><![CDATA[什么是Context
Context通常被译作上下文，它是一个比较抽象的概念。一般理解为程序单元的一个运行状态、现场，上下上下则是存在上下层的传递，上会把内容传递给下。在Go语言中，程序单元也就指的是Goroutine。
每个Goroutine在执行之前，都要先知道程序当前的执行状态，通常将这些执行状态封装在一个Context变量中，传递给要执行的Goroutine中。上下文则几乎已经成为传递与请...]]></description><category></category></item><item><title><![CDATA[centos安装mysql]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102524079</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102524079</guid><author>blogsun</author><pubDate>Sat, 12 Oct 2019 17:10:18 +0800</pubDate><description><![CDATA[一, 创建用户:
命令:CREATE USER ‘username’@‘host’ IDENTIFIED BY ‘password’;
说明:username - 你将创建的用户名, host - 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%. password - 该用户的登陆密码,密码可以为空,如果为空则该用户可...]]></description><category></category></item><item><title><![CDATA[GLSurfaceView]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102524007</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102524007</guid><author>blogsun</author><pubDate>Sat, 12 Oct 2019 17:07:52 +0800</pubDate><description><![CDATA[用户可以在GlSurfaceView上自定义渲染器（render）并在独立的线程中运行,内置一个surface(一块内存)能直接在android view上排版，它管理的egl display可以让opengl 把内容渲染在suerface上。
GLSurfaceView是一个视图，继承至SurfaceView，它内嵌的surface专门负责OpenGL渲染。
GLSurfaceView提供了下列...]]></description><category></category></item><item><title><![CDATA[apk内部存储路径]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102523974</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102523974</guid><author>blogsun</author><pubDate>Sat, 12 Oct 2019 17:05:22 +0800</pubDate><description><![CDATA[首先内部存储路径为/data/data/youPackageName/，下面讲解的各路径都是基于你自己的应用的内部存储路径下。所有内部存储中保存的文件在用户卸载应用的时候会被删除。
一、 files

Context.getFilesDir()，该方法返回/data/data/youPackageName/files的File对象。
Context.openFileInput()与Context....]]></description><category></category></item><item><title><![CDATA[android数据存储]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102523869</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102523869</guid><author>blogsun</author><pubDate>Sat, 12 Oct 2019 17:03:18 +0800</pubDate><description><![CDATA[数据存储在开发中是使用最频繁的，在这里主要介绍Android平台中实现数据存储的5种方式，分别是：
1 使用SharedPreferences存储数据
2 文件存储数据
3 SQLite数据库存储数据
4 使用ContentProvider存储数据
5 网络存储数据
第一种： 使用SharedPreferences存储数据
SharedPreferences是Android平台上一个轻量级的存储类...]]></description><category></category></item><item><title><![CDATA[如何获取android唯一识别码]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102523771</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102523771</guid><author>blogsun</author><pubDate>Sat, 12 Oct 2019 16:57:57 +0800</pubDate><description><![CDATA[DEVICE_ID
Android系统为开发者提供的用于标识手机设备的串号，也是各种方法中普适性较高的，可以说几乎所有的设备都可以返回这个串号，并且唯一性良好。
这个DEVICE_ID可以同通过下面的方法获取：
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String DE...]]></description><category></category></item><item><title><![CDATA[android横竖屏切换]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102523733</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102523733</guid><author>blogsun</author><pubDate>Sat, 12 Oct 2019 16:56:18 +0800</pubDate><description><![CDATA[切换横竖屏的方案

在AndroidManifest.xml中配置

在项目的AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性，它有以下几个参数：
“unspecified”:默认值 由系统来判断显示方向.判定的策略是和设备相关的，所以不同的设备会有不同的显示方向.
“landscape”:横屏显示（宽比高要长）
“...]]></description><category></category></item><item><title><![CDATA[centos安装redis]]></title><link>https://blog.youkuaiyun.com/blogsun/article/details/102523399</link><guid>https://blog.youkuaiyun.com/blogsun/article/details/102523399</guid><author>blogsun</author><pubDate>Sat, 12 Oct 2019 16:51:09 +0800</pubDate><description><![CDATA[安装redis

下载redis安装包

   wget http://download.redis.io/releases/redis-4.0.6.tar.gz


解压压缩包

   tar -zxvf redis-4.0.6.tar.gz


安装gcc依赖

   yum install gcc -y


编译安装

	cd redis-4.0.6
	make MALLOC=libc　

...]]></description><category></category></item></channel></rss>