首页 文章 精选 留言 我的

精选列表

搜索[工具库],共10000篇文章
优秀的个人博客,低调大师

go-mir v2.6.1 发布,用 Go 结构体标签定义 handler 路由信息的辅助

go-mir v2.6.1发布了,支持多个web框架,自带mirc脚手架,零基础开发web应用,方便快捷。 新增特性: 添加fiber的支持,mirc自动生成相应web框架样式的接口代码; 优化代码生成器,更新所使用的web框架版本; 预告下一版本开发计划 go-mir v2已经发布到v2.6.1,可以说实现了最初对v2版本的设计预想,现在是时候朝着v3版本演进了... go-mir v1的架构大体是这样: 这套架构主要是使用了golang的反射机制对struct tag解析然后注册路由信息到web engine,只影响启动时间,不会有运行时损耗,总体来说,方便了接口定义,对代码组织很有益处。 go-mir v2的架构大体如下: v2版本升级采用代码生成的方式生成接口代码,同样也是采用golang内置的struct tag定义路由信息,但不同于v1版本在引擎启动时解析后注册路由信息到web引擎,这里参考grpc的接口生成方式,生成接口定义文件,业务逻辑只要实现了接口,注册接口实现的对象到相应的web引擎,启动后就可以对外通过RESTfull接口获取服务。 go-mir v3版本目前还处于原型设计中,大体情况如下: 下图是早先在开发v2版本时设想v2到v3版本演进的架构设计预想,预备使用OpenApi v3.0的定义文件直接生成接口代码,后面的逻辑和v2保持一致。OpenAPI v3.0定义RESTfull API接口非常清晰、方便的,但也是有点繁琐,OpenAPI本身最早之前是为了API文档自动生成而设计,后面才演变成兼具api代码自动生成,总的来说,使用OpenAPI是有点繁琐的。 go-mir 的主要功能是辅助开发工程师设计api然后自动生成api的样板代码,直接目的就是api代码自动生成,使用方式奔着gRPC的体验走(定义protocol文件,使用protoc自动生成rpc代码)。本着不变初衷的期望,v3版本的go-mir将设计一套命名为M2的自定义DSL(领域描述语言) 来定义api,然后使用mirc依据m2定义文件自动生成api样板代码,大体架构设计如下: 使用m2定义API的早期预览(目前M2还在设计阶段,可以参考issue): % cd examples/mirc/draft % tree . ├── core.m2 ├── mirc.yaml ├── site_v1.m2 └── site_v2.m2 %> cat site_v1.m2 // Copyright 2021 Michael Li <alimy@gility.net>. All rights reserved. // Use of this source code is governed by Apache License 2.0 that // can be found in the LICENSE file. //mir:syntax v0.1-alpha.1 package v1 message ArticleReq { Content string `json:"content"` } message ArticleRes { Code int `json:"code"` Msg string `json:"msg"` PostId string `json:"postid"` } // Site v1 service service Site(group: v1) { Index() `get:"/index/"` Articles() `get:"/articles/:category/"` Category() `get:"/category/"` PostArticle(ArticleReq) ArticleRes `post:"/articles/:category/"` } %> cat mirc.yaml mir: version: v0.1-alpha.1 generate: go_options: import_path: github.com/alimy/mir/v3/examples/mirc plugins: - name: go type: go flags: plugins=mirc output: internal/auto %> cat core.m2 // Copyright 2021 Michael Li <alimy@gility.net>. All rights reserved. // Use of this source code is governed by Apache License 2.0 that // can be found in the LICENSE file. //mir:syntax v0.1-alpha.1 package core message ArticleReq { Content string `json:"content"` } message ArticleRes { Code int `json:"code"` Msg string `json:"msg"` PostId string `json:"postid"` } message IndexHead { LastTime string `param:"lastTime"` } %> cat core.m2 // Copyright 2021 Michael Li <alimy@gility.net>. All rights reserved. // Use of this source code is governed by Apache License 2.0 that // can be found in the LICENSE file. //mir:syntax v0.1-alpha.1 package v2 import core // Site v2 service service Site(group: v2, chain: _) { Index(core.indexParam) `get:"/index"` Articles() `get, post:"/articles/:category/"` Category() `get:"/category/"` PostArticle(core.ArticleReq) core.ArticleRes `post:"/articles/:category/"` } 使用方式: #使用方式 %> cd .. && pwd go/src/github.com/alimy/mir/examples/mirc %> mirc generate --style gin draft # will generate files to internal/auto %> tree internal/auto . ├── site.go ├── v1 │ └── site.go └── v2 └── core.go └── site.go go-mir v3目前还在早期设计阶段,确定m2的语法定义后,将着手开始编写解析器,然后对接v2的代码生成器,生成相应web框架的代码,最新进展请关注https://github.com/alimy/mir/tree/v3。 go-mir v2 功能特性: 使用Go结构体标签定义handler路由信息; 自动根据定义的结构体标签信息生成handler接口,开发者实现相应接口后注册到router,与gRPC的使用方式类似; 内置支持gin、go-chi、mux、httprouter、echo、iris、macaron、fiber的代码生成器; 自带脚手架mirc自动生成gin、go-chi、mux、httprouter、echo、iris、macaron、fiber样式的模板工程代码; 支持多goroutine并发生成接口代码,加快代码生成效率; go-mir v2代码示例:(eg: gin style) 生成样板代码 % go get github.com/alimy/mir/mirc/v2@latest % mirc new -d mir-examples % tree mir-examples mir-examples ├── Makefile ├── README.md ├── go.mod ├── main.go └── mirc ├── main.go └── routes ├── site.go ├── v1 │ └── site.go └── v2 └── site.go % cd mir-examples % make generate 自定义路由信息,比如: // file: mirc/routes/v1/site.go package v1 import ( "github.com/alimy/mir/v2" "github.com/alimy/mir/v2/engine" ) func init() { engine.AddEntry(new(Site)) } // Site mir's struct tag define type Site struct { Chain mir.Chain `mir:"-"` Group mir.Group `mir:"v1"` Index mir.Get `mir:"/index/"` Articles mir.Get `mir:"/articles/:category/"` } 定义生成器入口,比如: // file: mirc/main.go package main import ( "log" "github.com/alimy/mir/v2/core" "github.com/alimy/mir/v2/engine" _ "github.com/alimy/mir/v2/examples/mirc/routes" _ "github.com/alimy/mir/v2/examples/mirc/routes/v1" _ "github.com/alimy/mir/v2/examples/mirc/routes/v2" ) //go:generate go run main.go func main() { log.Println("generate code start") opts := core.Options{ core.RunMode(core.InSerialDebugMode), core.GeneratorName(core.GeneratorGin), core.SinkPath("./gen"), } if err := engine.Generate(opts); err != nil { log.Fatal(err) } log.Println("generate code finish") } 自动生成接口,基于上面的定义,生成器将自动生成接口定义文件,如下: % make generate % cat mirc/gen/api/v1/site.go // Code generated by go-mir. DO NOT EDIT. package v1 import ( "github.com/gin-gonic/gin" ) type Site interface { // Chain provide handlers chain for gin Chain() gin.HandlersChain Index(*gin.Context) Articles(*gin.Context) } // RegisterSiteServant register Site servant to gin func RegisterSiteServant(e *gin.Engine, s Site) { router := e.Group("v1") // use chain for router middlewares := s.Chain() router.Use(middlewares...) // register routes info to router router.Handle("GET", "/index/", s.Index) router.Handle("GET", "/articles/:category/", s.Articles) } 实现接口逻辑, 比如: // file: servants/site_v1.go package servants import ( "net/http" "github.com/gin-gonic/gin" api "github.com/alimy/mir/v2/examples/mirc/gen/api/v1" ) var _ api.Site = EmptySiteV1{} // EmptySiteV1 implement api.Site interface type EmptySiteV1 struct{} func (EmptySiteV1) Chain() gin.HandlersChain { return gin.HandlersChain{gin.Logger()} } func (EmptySiteV1) Index(c *gin.Context) { c.String(http.StatusOK, "get index data (v1)") } func (EmptySiteV1) Articles(c *gin.Context) { c.String(http.StatusOK, "get articles data (v1)") } 注册接口实现对象到相对应的router,比如: package main import ( "log" "github.com/gin-gonic/gin" "github.com/alimy/mir/v2/examples/mirc/gen/api" "github.com/alimy/mir/v2/examples/mirc/gen/api/v1" "github.com/alimy/mir/v2/examples/mirc/gen/api/v2" "github.com/alimy/mir/v2/examples/servants" ) func main() { e := gin.New() // register servants to engine registerServants(e) // start servant service if err := e.Run(); err != nil { log.Fatal(err) } } func registerServants(e *gin.Engine) { // register default group routes api.RegisterSiteServant(e, servants.EmptySiteWithNoGroup{}) // register routes for group v1 v1.RegisterSiteServant(e, servants.EmptySiteV1{}) // register routes for group v2 v2.RegisterSiteServant(e, servants.EmptySiteV2{}) } 最后,构建并运行应用: % make run 大功告成,是不是很简单,赶紧上手吧:) 演示项目: examples:一个简单的快速了解如何使用mir的演示项目; mir-covid19: 新冠疫情统计TH_COVID19_International的Golang版本,完整的演示了如何使用mir快速开发一个web应用。

优秀的个人博客,低调大师

模板建站案例-中小企业建站-网页建站-建站案例 - 阿里云建站[官网推荐]

使用阿里云建网站的三种方式购买云服务器手动建站、云速成美站模板建站或者选择阿里云定制建站三种方式,站长分享利用阿里云创建网站的三种方式及优势对比: 阿里云建站方法汇总使用阿里云建站可以有三种方式,一种是购买ECS云服务器,然后自行手动搭建网站,需要技术门槛;第二种方式是购买阿里云官网云速成美站,使用模板建站,阿里云提供上千套模板,模板建站价格便宜,会打字就会建站;第三种是使用阿里云官方定制建站,需要什么样的网站什么功能,阿里云建站专家提供一对一网站定制。参考下表: 有需要的朋友可以提前领取优惠劵,后期可以为大家减少不少成本点击领取云小站券 阿里云建站方式 所需产品 优势 适用人群 自助建站 ECS云服务器 自行购买云服务器,手动搭建网站 需要些技术门槛,适用于刚接触云计算或对云服务器和建站不太了解、希望自行设计网站的个人或小企业用户。 模板建站 云·速成美站 使用阿里云提供上千套模板,可视化后台管理,会打字就会建站 适合有一定软件应用能力的个人或小企业用户,模板建站支持Web站点、移动端站点、互动表单以及会员支付多场景。 定制建站 云·企业网站定制和功能定制 由阿里云专业网站设计师完成网站设计及搭建 适合对网站有品质要求或个性化需求、希望节省人力和时间成本的企业用户。 阿里云建站产品如何选择?如果您是站长类的技术人员,当然选择自助建站方式,如果非技术人员,个人或者工作室建议选择云·速成美站,如果是企业用户建站选择阿里云网站定制服务。 阿里云建站不需要用户另外购买云服务器或虚拟主机等产品,阿里云提供香港节点并且提供全球CDN加速,不用备案,拿来即用。阿里云大品牌无隐形消费,我见过太多打着免费建站的幌子,实际价格贵的离谱。举例来说,免费建站,使用的域名是对方的三级域名,域名人家说收回就收回,免费建站,云主机却要收费,而且价格很贵没有质量保障,网站说打不开就打不开。 我从新手过来的,之前使用过免费域名,用了有一段时间了,结果被收回了,使用免费虚拟主机,速度卡不说,结果网站数据丢失了,这不是免费惹的祸,是小编贪图便宜惹的祸,建议选择大品牌,值得信赖。

优秀的个人博客,低调大师

支撑数千家天猫商家CRM业务,数云高弹性数据如何做

“数据,已经渗透到当今每一个行业和业务职能领域,成为重要的生产因素。人们对于海量数据的挖掘和运用,预示着新一波生产率增长和消费者盈余浪潮的到来”。-----麦肯锡 基于互联网和大数据和时代背景,用户在互联网上留下更多的印记,给企业提供了更多的用户相关数据,有了这些数据,企业不用再盲目地探索营销手段,而是可以运用大数据能力来降低成本提升产品的效益性,并实现精准化到用户需求,大数据分析借助巨大商业价值逐步走向营销的舞台,越来越多的品牌试图从海量的数据中分析出有价值的商业信息,以便做到精准营销。 数云是国内领先的数据化运营解决方案服务提供商,致力为消费品牌和零售品牌商提供整合软件产品、数据模型和专业服务的一站式数据化营销解决方案,数云在CRM领域的品牌客户保有量、品牌客户市场占有率、产品和解决方案综合能力等方面都排名第一。业务的高速发展和核

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册