精华内容
下载资源
问答
  • 公交车 强大,快速,更好使用和简单的Golang微服务框架
  • go-zero 文件服务go-zero本身支持文件服务,但是我们需要写相关的handler文件,本文目的在于不写任何一个和...你可能需要阅读golang微服务框架go-zero系列-1:在go-zero中使用XormV2golang微服务框架go-zero系列-2:在g...

    go-zero 文件服务

    go-zero本身支持文件服务,但是我们需要写相关的handler文件,本文目的在于

    • 不写任何一个和文件相关的handler

    • 如果有新的文件,直接把文件模板到某个特定目录就好,不要动任何go代码

    需求在这里,开撸吧

    在代码开始前,你可能需要阅读

    golang微服务框架go-zero系列-1:在go-zero中使用XormV2
    golang微服务框架go-zero系列-2:在go-zero中使用jwt-token鉴权实践
    golang微服务框架go-zero系列-3:扩展go-zero,使之支持html模板解析自动化

    注意

    微服务讲究资源分离,实际生产过程中尽量使用专业的文件服务器或者OSS等第三方存储平台

    file服务实现思路

    gin中有专门的static file服务封装,go-zero目前并没有提供。目前go-zero提供非常严格的路径匹配,如
    访问/asset/l1.jpg 将映射到 /asset/:1对应的handlerlv1/asset/l1/l2.jpg 将映射到 /asset/:1/:2对应的handlerlv2
    这有如下俩种情况

    映射指定路径到单个文件

    比如我们需要访问favourite.ico,系统指向./www/favourite.ico文件,代码如下

    //处理函数,传入文件地址
    func filehandler(filepath string) http.HandlerFunc {
    return func(w http.ResponseWriter, req *http.Request) {
    http.ServeFile(w, req, filepath)
    }
    }

    在router里面直接调用AddRoute方法添加单个路由

    func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {

    //这里直接添加单个
    engine.AddRoute(
    rest.Route{
    Method: http.MethodGet,
    Path: "/favourite.ico",
    Handler: filehandler("./www/favourite.ico"),
    })
    }

    映射指定目录并提供服务

    实际过程中我们需要对外暴露某一个目录,比如/assets/目录,该目录下存放一些资源文件如css,js,img

    tree /f
    +---assets| +---css| +---fonts| +---images| +---js| \---plugins| +---font-awesome| | +---css| | \---fonts| +---fontawesome| | +---css| | \---fonts| +---ionicons| | +---css| | \---fonts| +---jquery.contextmenu| | \---images| +---jquery.pin| | +---css| | \---images| +---jqueryui-1.12.1| | +---external| | | \---jquery| | \---images| \---swiper-4.5.3| +---css| \---js

    如果使用单个文件的方式来实现,肯定不合理,因为router会非常大,怎么解决这个问题?我们可以使用如下方法实现文件夹服务

    //
    func dirhandler(patern, filedir string) http.HandlerFunc {

    return func(w http.ResponseWriter, req *http.Request) {
    handler := http.StripPrefix(patern, http.FileServer(http.Dir(filedir)))
    handler.ServeHTTP(w, req)

    }
    }

    如上函数的核心是http.StripPrefix(patern, http.FileServer(http.Dir(filedir)))函数,这个函数的核心功能是将映patern格式映射到某一个目录filedir

    • patern:请求路径格式/assets/:1,/assets/:1/:2这种

    • filedir:映射对应的文件夹./assets/这种

    那么我们只需要构建多级文件访问格式和dirhandler的映射关系即可

    func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {

    //这里注册
    dirlevel := []string{":1", ":2", ":3", ":4", ":5", ":6", ":7", ":8"}
    patern := "/asset/"
    dirpath := "./assets/"
    for i := 1; i < len(dirlevel); i++ {
    path := prefix + strings.Join(dirlevel[:i], "/")
    //最后生成 /asset
    engine.AddRoute(
    rest.Route{
    Method: http.MethodGet,
    Path: path,
    Handler: dirhandler(patern,dirpath),
    })

    logx.Infof("register dir %s %s", path,dirpath)
    }
    }

    404

    404可以在main函数中配置

    rt := router.NewPatRouter()
    rt.SetNotFoundHandler(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
    //这里内容可以定制
    w.Write([]byte("服务器开小差了,这里可定制"))
    }))
    server := rest.MustNewServer(c.RestConf, rest.WithRouter(rt))

    此时请求http://127.0.0.1:8888/hello,系统响应服务器开小差了,这里可定制

    测试

    启动系统后运行

    E:\workspace@go\gozero\file>go run file.go
    2020/09/05 20:18:24 {"@timestamp":"2020-09-05T20:18:24.682+08","level":"info","content":"{{{file-api { console logs info false 0 100} pro { 0 }} 0.0.0.0 8081 false 10000 1048576 3000 900 {false 0s []}} [/asset/=./assets]}"}
    {"@timestamp":"2020-09-05T20:18:24.682+08","level":"info","content":"register dir /asset/:1 ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.683+08","level":"info","content":"register dir /asset/:1/:2 ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.683+08","level":"info","content":"register dir /asset/:1/:2/:3 ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.683+08","level":"info","content":"register dir /asset/:1/:2/:3/:4 ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.697+08","level":"info","content":"register dir /asset/:1/:2/:3/:4/:5 ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.697+08","level":"info","content":"register dir /asset/:1/:2/:3/:4/:5/:6 ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.698+08","level":"info","content":"register dir /asset/:1/:2/:3/:4/:5/:6/:7 ./assets"}

    访问系统都能正常响应

    http://127.0.0.1:8888/asset/images/avatar.jpghttp://127.0.0.1:8888/asset/js/test.jshttp://127.0.0.1:8888/asset/js/lv2/test.js

    注意,请求的是/asset/** 不是/assets/**

    思考一下

    我们可以在NotFoundHandler中根据req.URL.path来实现文件服务,如何实现呢?

    本文代码获取

    关注公众号betaidea 输入file即可获得本文相关代码
    关注公众号betaidea 输入html即可获得html解析相关代码
    关注公众号betaidea 输入jwt即可获得gozero集成jwt-token相关代码
    关注公众号betaidea 输入gozero即可gozero入门代码

    广而告之

    送福利了uniapp用户福音来啦!
    历经数十万用户考验,我们的客服系统终于对外提供服务了。
    你还在为商城接入客服烦恼吗?只需一行代码,即可接入啦!!
    只需一行代码!!!!

    /*kefu.vue*/<template><view><IdeaKefu :siteid="siteId"  >IdeaKefu>view>template><script>
    import IdeaKefu from "@/components/idea-kefu/idea-kefu.vue"
    export default {
    components:{
    IdeaKefu
    },
    data() {
    return {
    siteId:2
    }
    }
    }

    效果杠杠的5ad2f712683a7188b7743ace69b56d23.png

    开发文档地址
    http://kefu.techidea8.com/html/wiki/

    展开全文
  • go-zero 文件服务go-zero本身支持文件服务,但是我们需要写相关的handler文件,本文目的在于不写任何一个和...你可能需要阅读golang微服务框架go-zero系列-1:在go-zero中使用XormV2golang微服务框架go-zero系列-2:在g...

    go-zero 文件服务

    go-zero本身支持文件服务,但是我们需要写相关的handler文件,本文目的在于

    • 不写任何一个和文件相关的handler

    • 如果有新的文件,直接把文件模板到某个特定目录就好,不要动任何go代码

    需求在这里,开撸吧

    在代码开始前,你可能需要阅读

    golang微服务框架go-zero系列-1:在go-zero中使用XormV2
    golang微服务框架go-zero系列-2:在go-zero中使用jwt-token鉴权实践
    golang微服务框架go-zero系列-3:扩展go-zero,使之支持html模板解析自动化

    注意

    微服务讲究资源分离,实际生产过程中尽量使用专业的文件服务器或者OSS等第三方存储平台

    file服务实现思路

    gin中有专门的static file服务封装,go-zero目前并没有提供。目前go-zero提供非常严格的路径匹配,如
    访问/asset/l1.jpg 将映射到 /asset/:1对应的handlerlv1/asset/l1/l2.jpg 将映射到 /asset/:1/:2对应的handlerlv2
    这有如下俩种情况

    映射指定路径到单个文件

    比如我们需要访问favourite.ico,系统指向./www/favourite.ico文件,代码如下

    //处理函数,传入文件地址
    func filehandler(filepath string) http.HandlerFunc {
    return func(w http.ResponseWriter, req *http.Request) {
    http.ServeFile(w, req, filepath)
    }
    }

    在router里面直接调用AddRoute方法添加单个路由

    func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {

    //这里直接添加单个
    engine.AddRoute(
    rest.Route{
    Method: http.MethodGet,
    Path: "/favourite.ico",
    Handler: filehandler("./www/favourite.ico"),
    })
    }

    映射指定目录并提供服务

    实际过程中我们需要对外暴露某一个目录,比如/assets/目录,该目录下存放一些资源文件如css,js,img

    tree /f
    +---assets| +---css| +---fonts| +---images| +---js| \---plugins| +---font-awesome| | +---css| | \---fonts| +---fontawesome| | +---css| | \---fonts| +---ionicons| | +---css| | \---fonts| +---jquery.contextmenu| | \---images| +---jquery.pin| | +---css| | \---images| +---jqueryui-1.12.1| | +---external| | | \---jquery| | \---images| \---swiper-4.5.3| +---css| \---js

    如果使用单个文件的方式来实现,肯定不合理,因为router会非常大,怎么解决这个问题?我们可以使用如下方法实现文件夹服务

    //
    func dirhandler(patern, filedir string) http.HandlerFunc {

    return func(w http.ResponseWriter, req *http.Request) {
    handler := http.StripPrefix(patern, http.FileServer(http.Dir(filedir)))
    handler.ServeHTTP(w, req)

    }
    }

    如上函数的核心是http.StripPrefix(patern, http.FileServer(http.Dir(filedir)))函数,这个函数的核心功能是将映patern格式映射到某一个目录filedir

    • patern:请求路径格式/assets/:1,/assets/:1/:2这种

    • filedir:映射对应的文件夹./assets/这种

    那么我们只需要构建多级文件访问格式和dirhandler的映射关系即可

    func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {

    //这里注册
    dirlevel := []string{":1", ":2", ":3", ":4", ":5", ":6", ":7", ":8"}
    patern := "/asset/"
    dirpath := "./assets/"
    for i := 1; i < len(dirlevel); i++ {
    path := prefix + strings.Join(dirlevel[:i], "/")
    //最后生成 /asset
    engine.AddRoute(
    rest.Route{
    Method: http.MethodGet,
    Path: path,
    Handler: dirhandler(patern,dirpath),
    })

    logx.Infof("register dir %s %s", path,dirpath)
    }
    }

    404

    404可以在main函数中配置

    rt := router.NewPatRouter()
    rt.SetNotFoundHandler(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
    //这里内容可以定制
    w.Write([]byte("服务器开小差了,这里可定制"))
    }))
    server := rest.MustNewServer(c.RestConf, rest.WithRouter(rt))

    此时请求http://127.0.0.1:8888/hello,系统响应服务器开小差了,这里可定制

    测试

    启动系统后运行

    E:\workspace@go\gozero\file>go run file.go
    2020/09/05 20:18:24 {"@timestamp":"2020-09-05T20:18:24.682+08","level":"info","content":"{{{file-api { console logs info false 0 100} pro { 0 }} 0.0.0.0 8081 false 10000 1048576 3000 900 {false 0s []}} [/asset/=./assets]}"}
    {"@timestamp":"2020-09-05T20:18:24.682+08","level":"info","content":"register dir /asset/:1 ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.683+08","level":"info","content":"register dir /asset/:1/:2 ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.683+08","level":"info","content":"register dir /asset/:1/:2/:3 ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.683+08","level":"info","content":"register dir /asset/:1/:2/:3/:4 ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.697+08","level":"info","content":"register dir /asset/:1/:2/:3/:4/:5 ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.697+08","level":"info","content":"register dir /asset/:1/:2/:3/:4/:5/:6 ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.698+08","level":"info","content":"register dir /asset/:1/:2/:3/:4/:5/:6/:7 ./assets"}

    访问系统都能正常响应

    http://127.0.0.1:8888/asset/images/avatar.jpghttp://127.0.0.1:8888/asset/js/test.jshttp://127.0.0.1:8888/asset/js/lv2/test.js

    注意,请求的是/asset/** 不是/assets/**

    思考一下

    我们可以在NotFoundHandler中根据req.URL.path来实现文件服务,如何实现呢?

    本文代码获取

    关注公众号betaidea 输入file即可获得本文相关代码
    关注公众号betaidea 输入html即可获得html解析相关代码
    关注公众号betaidea 输入jwt即可获得gozero集成jwt-token相关代码
    关注公众号betaidea 输入gozero即可gozero入门代码

    广而告之

    送福利了uniapp用户福音来啦!
    历经数十万用户考验,我们的客服系统终于对外提供服务了。
    你还在为商城接入客服烦恼吗?只需一行代码,即可接入啦!!
    只需一行代码!!!!

    /*kefu.vue*/<template><view><IdeaKefu :siteid="siteId"  >IdeaKefu>view>template><script>
    import IdeaKefu from "@/components/idea-kefu/idea-kefu.vue"
    export default {
    components:{
    IdeaKefu
    },
    data() {
    return {
    siteId:2
    }
    }
    }

    效果杠杠的3d7b0115ed7dd868d72e7a86f3152e7e.png

    开发文档地址
    http://kefu.techidea8.com/html/wiki/

    展开全文
  • go-sky是一个Golang微服务框架,集成了一些非常流行的软件包和工具。 如下: github.com/go-kit/kit github.com/uber-go/zap gopkg.in/natefinch/lumberjack.v2 github.com/opentracing/opentracing-go github....
  • golang微服务框架go-zero系列-4:go-zero文件服务 go-zero本身支持文件服务,但是我们需要写相关的handler文件,本文目的在于 不写任何一个和文件相关的handler 如果有新的文件,直接把文件模板到某个特定目录就好,不要...

    golang微服务框架go-zero系列-4:go-zero文件服务

    go-zero本身支持文件服务,但是我们需要写相关的handler文件,本文目的在于

    • 不写任何一个和文件相关的handler
    • 如果有新的文件,直接把文件模板到某个特定目录就好,不要动任何go代码

    需求在这里,开撸吧

    在代码开始前,你可能需要阅读

    golang微服务框架go-zero系列-1:在go-zero中使用XormV2
    golang微服务框架go-zero系列-2:在go-zero中使用jwt-token鉴权实践
    golang微服务框架go-zero系列-3:扩展go-zero,使之支持html模板解析自动化

    注意

    微服务讲究资源分离,实际生产过程中尽量使用专业的文件服务器或者OSS等第三方存储平台

    file服务实现思路

    gin中有专门的static file服务封装,go-zero目前并没有提供。目前go-zero提供非常严格的路径匹配,如
    访问
    /asset/l1.jpg 将映射到 /asset/:1对应的handlerlv1
    /asset/l1/l2.jpg 将映射到 /asset/:1/:2对应的handlerlv2
    这有如下俩种情况

    映射指定路径到单个文件

    比如我们需要访问favourite.ico,系统指向./www/favourite.ico文件,代码如下

    //处理函数,传入文件地址
    func filehandler(filepath string) http.HandlerFunc {
    	return func(w http.ResponseWriter, req *http.Request) {
    		http.ServeFile(w, req, filepath)
    	}
    }
    

    在router里面直接调用AddRoute方法添加单个路由

    func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {
    
    //这里直接添加单个
    engine.AddRoute(
    				rest.Route{
    					Method:  http.MethodGet,
    					Path:    "/favourite.ico",
    					Handler: filehandler("./www/favourite.ico"),
    				})
    }
    

    映射指定目录并提供服务

    实际过程中我们需要对外暴露某一个目录,比如/assets/目录,该目录下存放一些资源文件如css,js,img

    tree /f
    +---assets                                     
    |   +---css                                    
    |   +---fonts                                  
    |   +---images                                 
    |   +---js                                     
    |   \---plugins                                
    |       +---font-awesome                       
    |       |   +---css                            
    |       |   \---fonts                          
    |       +---fontawesome                        
    |       |   +---css                            
    |       |   \---fonts                          
    |       +---ionicons                           
    |       |   +---css                            
    |       |   \---fonts                          
    |       +---jquery.contextmenu                 
    |       |   \---images                         
    |       +---jquery.pin                         
    |       |   +---css                            
    |       |   \---images                         
    |       +---jqueryui-1.12.1                    
    |       |   +---external                       
    |       |   |   \---jquery                     
    |       |   \---images                         
    |       \---swiper-4.5.3                       
    |           +---css                            
    |           \---js                             
    

    如果使用单个文件的方式来实现,肯定不合理,因为router会非常大,怎么解决这个问题?我们可以使用如下方法实现文件夹服务

    //
    func dirhandler(patern, filedir string) http.HandlerFunc {
    
    	return func(w http.ResponseWriter, req *http.Request) {
    		handler := http.StripPrefix(patern, http.FileServer(http.Dir(filedir)))
    		handler.ServeHTTP(w, req)
    
    	}
    }
    

    如上函数的核心是http.StripPrefix(patern, http.FileServer(http.Dir(filedir)))函数,这个函数的核心功能是将映patern格式映射到某一个目录filedir

    • patern:请求路径格式/assets/:1,/assets/:1/:2这种
    • filedir:映射对应的文件夹./assets/这种

    那么我们只需要构建多级文件访问格式和dirhandler的映射关系即可

    func RegisterHandlers(engine *rest.Server, serverCtx *svc.ServiceContext) {
    
    			//这里注册
    			dirlevel := []string{":1", ":2", ":3", ":4", ":5", ":6", ":7", ":8"}
    			patern := "/asset/"
    			dirpath := "./assets/"
    			for i := 1; i < len(dirlevel); i++ {
    				path := prefix + strings.Join(dirlevel[:i], "/")
    				//最后生成 /asset
    				engine.AddRoute(
    					rest.Route{
    						Method:  http.MethodGet,
    						Path:    path,
    						Handler: dirhandler(patern,dirpath),
    					})
    
    				logx.Infof("register dir  %s  %s", path,dirpath)
    			}
    }
    

    404

    404可以在main函数中配置

    rt := router.NewPatRouter()
    	rt.SetNotFoundHandler(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
    		//这里内容可以定制
    		w.Write([]byte("服务器开小差了,这里可定制"))
    	}))
    	server := rest.MustNewServer(c.RestConf, rest.WithRouter(rt))
    

    此时请求http://127.0.0.1:8888/hello,系统响应
    服务器开小差了,这里可定制

    测试

    启动系统后运行

    E:\workspace@go\gozero\file>go run file.go
    2020/09/05 20:18:24 {"@timestamp":"2020-09-05T20:18:24.682+08","level":"info","content":"{{{file-api { console logs info false 0 100} pro  { 0 }} 0.0.0.0 8081 false 10000 1048576 3000 900 {false 0s []}} [/asset/=./assets]}"} 
    {"@timestamp":"2020-09-05T20:18:24.682+08","level":"info","content":"register dir  /asset/:1  ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.683+08","level":"info","content":"register dir  /asset/:1/:2  ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.683+08","level":"info","content":"register dir  /asset/:1/:2/:3  ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.683+08","level":"info","content":"register dir  /asset/:1/:2/:3/:4  ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.697+08","level":"info","content":"register dir  /asset/:1/:2/:3/:4/:5  ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.697+08","level":"info","content":"register dir  /asset/:1/:2/:3/:4/:5/:6  ./assets"}
    {"@timestamp":"2020-09-05T20:18:24.698+08","level":"info","content":"register dir  /asset/:1/:2/:3/:4/:5/:6/:7  ./assets"}
    
    

    访问系统都能正常响应

    http://127.0.0.1:8888/asset/images/avatar.jpg
    http://127.0.0.1:8888/asset/js/test.js
    http://127.0.0.1:8888/asset/js/lv2/test.js

    注意,请求的是/asset/** 不是/assets/**

    思考一下

    我们可以在NotFoundHandler中根据req.URL.path来实现文件服务,如何实现呢?

    下章预告

    单体应用需要的基本梳理完,明天开始微服务

    本文代码获取

    关注公众号betaidea 输入file即可获得本文相关代码
    关注公众号betaidea 输入html即可获得html解析相关代码
    关注公众号betaidea 输入jwt即可获得gozero集成jwt-token相关代码
    关注公众号betaidea 输入gozero即可gozero入门代码

    广而告之

    送福利了uniapp用户福音来啦!
    历经数十万用户考验,我们的客服系统终于对外提供服务了。
    你还在为商城接入客服烦恼吗?只需一行代码,即可接入啦!!
    只需一行代码!!!

    /*kefu.vue*/
    <template>
    	<view>
    		<IdeaKefu :siteid="siteId"  ></IdeaKefu>
    	</view>
    </template>
    
    <script>
    	import IdeaKefu from "@/components/idea-kefu/idea-kefu.vue"
        export default {
    		components:{
    			IdeaKefu
    		},
    		data() {
    			return {
    				siteId:2
    			}
    		}
        }   
    

    效果杠杠的
    客服效果

    开发文档地址
    http://kefu.techidea8.com/html/wiki/

    展开全文
  • 本章节阐述micro消息订阅和发布相关内容 ...golang微服务框架go-micro 入门笔记2.1 micro工具之micro api golang微服务框架go-micro 入门笔记2.2 micro工具之micro web broker代理 微服务之间需要通过...

    本章节阐述micro消息订阅和发布相关内容

    阅读本文前你可能需要进行如下知识储备

    broker代理

    微服务之间需要通过broker来传递消息,go-micro支持http/nats/memory三种broker,其中http是默认的broker。

    同时,go-micro以强大的插件形式,提供如下几种常见的broker。

    
    $ls
    
    gocloud/  googlepubsub/  grpc/  kafka/  mqtt/  nats/  nsq/  proxy/  rabbitmq/  redis/  snssqs/  sqs/  stan/  stomp/
    

    http

    HTTP Broker 是基于HTTP的异步broker,源代码在github.commicrogo-micro@v1.9.1brokerbroker.go中,默认DefaultBroker为http

    
    var (
        DefaultBroker Broker = newHttpBroker()
    )
    

    httpbroker实际上就是一个结构体

    
    type httpBroker struct {
    
        id      string  //微服务ID
        address string //主机地址
        opts    Options //一些配置
        mux *http.ServeMux  //通过这个监听其他端发送的http请求
        c *http.Client  //通过这个发送请求到其他端
        r registry.Registry 
        sync.RWMutex
        subscribers map[string][]*httpSubscriber  //订阅
        running     bool
        exit        chan chan error
        // offline message inbox
        mtx   sync.RWMutex 
        inbox map[string][][]byte   //数据缓存
    
    }
    

    通过http.Client发送请求,通过http.ServeMux实现请求监听,通过inbox存储数据

    redis

    redis初始化代码如下

    
    //main.go
    
    //初始化URL格式redis://密码@主机:端口/
    
    b := redis.NewBroker(
            broker.Addrs("redis://user:secret@localhost:6379/"),
            )
    
    //初始化
    
    b.Init()
    
    //连接
    
    b.Connect()
    
    // 新建service
    
    service := grpc.NewService(
            micro.Name("go.micro.web.config"),
            micro.Version("latest"),
            micro.Broker(b),
    
        )
    
    //初始化service
    service.Init()
    //启动,运行,监听
    service.Run()
    

    启动应用程序需要指定broker为redis

    
    go run main.go --broker=redis
    

    grpc 初始化

    初始化过程如下

    
    //main.go
    
    import (
        "github.com/micro/go-plugins/broker/grpc"
    )
    
    
    
    // 建立连接
    
    b := grpc.NewBroker()
    b.Init()
    b.Connect()
    
    // 订阅事件
    sub, _ := b.Subscribe("events")
    defer sub.Unsubscribe()
    
    // 发布事件
    b.Publish("events", &broker.Message{
    
        Headers: map[string]string{"type": "event"},
    
        Body: []byte(`an event`),
    
    })
    

    启动应用程序需要指定broker为grpc

    
    go run main.go --broker=grpc
    

    rabbitmq 初始化

    初始化过程如下

    
    //main.go
    
    import (
    
        "github.com/micro/go-plugins/broker/grpc"
    
    )
    
    b := rabbitmq.NewBroker(
    
            broker.Addrs("amqp://用户名:密码@主机host:端口port"),
    
        )
    
    
    
        b.Init()
    
        b.Connect()
    

    启动应用程序需要指定broker为rabbitmq

    
    go run main.go plugin.go --broker=rabbitmq
    

    mqtt

    初始化过程如下

    
    //main.go
    
    import (
    
        "github.com/micro/go-micro"
    
        "github.com/micro/go-plugins/broker/mqtt"
    
    )
    
    func main() {
    
        service := micro.NewService(
    
            micro.Name("my.service"),
    
            micro.Broker(mqtt.NewBroker()),
    
        )
    
        //...
    
    }
    

    启动应用程序需要指定broker为mqtt

    
    go run main.go plugin.go --broker=mqtt
    

    其他

    其他可以阅读代码

    
    $GOPATH/src/github.com/micro/go-plugins/broker
    

    消息订阅和发布

    通过micro.RegisterSubscriber实现消息订阅

    消息订阅主要API接口如下,第一个参数标识消息主题,第二个参数表示服务实例。

    
    // Register Struct as Subscriber
    
    micro.RegisterSubscriber("go.micro.srv.testsrv", service.Server(), new(subscriber.Testsrv))
    
    // Register Function as Subscriber
    
    micro.RegisterSubscriber("go.micro.srv.testsrv", service.Server(), subscriber.Handler)
    

    重点注意第三个参数,第三个参数是处理函数,可以是函数,也可以是实现了

    func Handler(ctx context.Context, msg *testsrv.Message) error 方法的结构体,micro内部会根据参数类型自动适配。结构体中可以实现多个func Handler(ctx context.Context, msg *testsrv.Message) error类型方法

    通过broker.Subscribe实现订阅

    Broker提供如下接口

    
    type Broker interface {
    
        Init(...Option) error
    
        Options() Options
    
        Address() string
    
        Connect() error
    
        Disconnect() error
    
        Publish(topic string, m *Message, opts ...PublishOption) error
    
        Subscribe(topic string, h Handler, opts ...SubscribeOption) (Subscriber, error)
    
        String() string
    
    }
    

    • Subscribe 订阅事件,topic代表主题,h事件处理函数
    • Publish 发布事件

    消息处理函数Handler 定义

    在上述涉及到处理函数handler,具体含义如下

    
    type Handler func(Event) error
    
    // Event is given to a subscription handler for processing
    
    type Event interface {
    
        Topic() string
    
        Message() *Message
    
        Ack() error
    
    }
    
    
    
    type Message struct {
    
        Header map[string]string
    
        Body   []byte
    
    }
    

    通过broker.Publish实现发布

    举例如下

    
    // 建立连接
    
    b := grpc.NewBroker()
    
    b.Init()
    
    b.Connect()
    // 订阅事件
    
    sub, _ := b.Subscribe("events")
    
    defer sub.Unsubscribe()
    
    // 发布事件
    
    b.Publish("events", &broker.Message{
    
        Headers: map[string]string{"type": "event"},
    
        Body: []byte(`an event`),
    
    })
    

    通过micro publish实现发布

    举例如下

    
    micro publish "go.micro.web.config" "hello"
    

    实战和代码

    效果

    下载代码broker.zip 解压到techidea8.com/microapp/broker下运行,效果图忑效果

    • 发布消息需要注意json格式字符串
     micro publish go.micro.srv.broker "{\"say\":\"这是测试消息\"}"

    获得代码

    关注公众号回复micro-broker即可获得公众号betaidea

    展开全文
  • Golang 微服务教程(一)字数统计: 4,073原文链接:ewanvalentine.io,翻译已获作者 Ewan Valentine 授权。本节对 gRPC 的使用浅尝辄止,更多可参考:gRPC 中 Client 与 Server 数据交互的 4 种模式前言系列概览...
  • 本章节阐述go-micro 服务发现原理 go-micro架构 下图来自go-micro官方 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:...golang微服务框架go-micro 入门笔记2.1 micro工具之...
  • micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备... golang微服务框架go-micro 入门笔记2.1 micro工具之micro api 本文应用环境 名称 ...
  • micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行... golang微服务框架go-micro 入门笔记2.1 micro工具之micro api 本文应用环境 名称 描述 操作系统 ...
  • micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行... golang微服务框架go-micro 入门笔记2.1 micro工具之micro api 本文应用环境 名称 描述 操作系统 ...
  • Golang 微服务教程(二) 发表于 2018-05-12 | 阅读次数: | 字数统计: 3,763原文链接:ewanvalentine.io,翻译已获作者 Ewan Valentine 授权。本节未细致介绍 Docker,更多可参考:《第一本Docker书 修订版》前言在上...
  • JUPITER:面向治理的微服务框架 介绍 JUPITER是一个面向治理的微服务框架,在已有多年使用。 文献资料 有关,请参见。 快速开始 func main () { var app jupiter. Application app . Startup () app . Serve ( ...
  • 金光灿灿的Gorm V2+适合创业的golang微服务框架go-zero实战 创建项目 生成go.mod文件 以如下指令创建项目 mkdir jwttoken cd jwttoken go mod init jwttoken 定义user.api 本文设计API如下 描述 格式 方法 参数...
  • import ( "github.... }, func(db *gorm.DB) { usermigration.AutoMigrate(db)//数据库迁移 migration.Migration(db) }) defer db.ConnClose() } golang gin框架微服务一键搭建,为您很好的服务 文章来源 :...
  • { gin_run.GinRun(func(group *gin.RouterGroup) { //回调函数 gin路由添加 router.Router(group) }, func(db *gorm.DB) { //自动创建表 migration.Migration(db) }) } golang gin框架微服务一键搭建,...
  • 安装依赖及nameko五个完整的代码示例6、附录:docker的在线安装方式本篇技术关键词:nameko、rabbitMQ、rpc、swagger、flask,gevent、WSGI其中nameko是python的微服务框架。rabbitMQ作为消息中间件,用于服务注册。...
  • 为什么使用go-zero可以有第三个选择golang圈子不大,微服务框架框架屈指可数:除了go-micro、go-kit,几乎没有其他选择。go-zero为此提供第三个可能。go-micro 对webapi支持并不友好,需要运行micro指令,难以定制创业者...
  • 但是winlion太懒了,我甚至想 不写任何一个和模板相关的handler 如果有新的模板,直接把模板到某个特定目录就好,不要动任何go...金光灿灿的Gorm V2+适合创业的golang微服务框架go-zero实战 如果对go-zero已经了解,直接跳
  • golang微服务框架Kratos使用

    千次阅读 2020-05-21 16:32:35
    项目致力于提供完整的微服务研发体验,整合相关框架及工具后,微服务治理相关部分可对整体业务开发周期无感,从而更加聚焦于业务交付。对每位开发者而言,整套Kratos框架也是不错的学习仓库,可以了解和参考到...
  • golang圈子不大,微服务框架框架屈指可数:除了go-micro、go-kit,几乎没有其他选择。go-zero为此提供第三个可能。go-micro 对webapi支持并不友好,需要运行micro指令,难以定制 创业产品需要一款支持...
  • abp vNext新框架的热度一直都很高,于是最近上手将vNext的微服务Demo做了一番研究。我的体验是,vNext的微服务架构确实比较成熟,但是十分难以上手,对于没有微服务开发经验的.net人员来说几乎是看不懂的,所以研究...
  • 确认一遍对你没看错,微前端是从Golang开始核心观点:所有脱离业务场景的技术讨论都是耍流氓微前端实践过程中的感悟:juejin.im/post/686082…关键词:样式,事件,缓存的相互冲突,特性代码的规则方案,通信机制的...
  • golang圈子不大,微服务框架框架屈指可数:除了go-micro、go-kit,几乎没有其他选择。go-zero为此提供第三个可能。 go-micro 对webapi支持并不友好,需要运行micro指令,难以定制 创业产品需要一款支持业务成长的框架 ...
  • 介绍Golang 中的微服务系列总计十部分,预计每周更新。本系列的解决方案采用了 protobuf 和 gRPC 作为底层传输协议。为什么采用这两个技术呢?我花了相当长的时间,才想出并决定采用这个方案。这个方案对开发者来说...
  • 10 maxOpenConns: 10 logMode: true ... 4 uploaddir: 5 domainName: 6 ssl: 7 注意请将配置文件放置在根目录 golang gin框架微服务一键搭建,为您很好的服务 文章来源 :http://blog.zngue.com/post/59bd5a2b26.html
  • 6 月 1 日,斗鱼将基于 Go 语言的微服务框架 Jupiter 开源。作为国内知名的互联网直播公司,这也是斗鱼首次以公司的名义正式推出开源项目。 近年来,得益于日渐增长的高并发业务需求,微服务架构开始在国内逐渐普及...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 481
精华内容 192
关键字:

golang微服务框架