在挣扎中前行~~

近期需要使用 go kit 搭建,go 的微服务架构体系,毕竟这个东西是第一次使用,感觉好烦,都是从零开始,也从网上找一些文档来看,又一次看到一个使用工具直接生成kit工程的方案,后来随着自己的摸索,其实可以不用使用工具,直接创建一个空的工程,随后一点一点的完善这个工程就好,说了一点自己确实遇到的感受,好了,接下来开始 我们的学习

我们先介绍一下kit中的各个模块,这些模块是真的需要理解的模块定义,因为kit这个东西就是这么命名定义的:

kit

kit 究竟是什么?他不是框架,一定要记住,他不是框架,他是一个开发项目的工具包,框架和工具包的区别在哪?框架好多好多都是封装好的,你只需要调用相关接口,就可以完成好多好多功能;但是kit不是框架,他不会给你封装接口,不是你直接调用接口就可以完成你需要的功能,kit只会给你提供工具,工具包,第三方的工具包,kit会进行封装,封装自己的工具,放在自己的内部,因为kit是工具包,这个就相当于将第三方的工具封装成自己的工具;举一个简单的例子:

这是框架iris的 设置跨域的例子
func CRS(ctx iris.Context) {
	ctx.Header("Access-Control-Allow-Origin", "*")
	ctx.Header("Access-Control-Allow-Credentials", "true")
}
这一步是框架给你封装的,需要跟进去看一下,这个到底是给谁设置的
我们需要先看 这个context,到底是都包含了哪些东西~
type Context struct {
	// the http.ResponseWriter wrapped by custom writer.
	writer ResponseWriter
	// the original http.Request
	request *http.Request
	// the current route registered to this request path.
	currentRoute RouteReadOnly

	// the local key-value storage
	params RequestParams  // url named parameters.
	values memstore.Store // generic storage, middleware communication.
	query  url.Values     // GET url query temp cache, useful on many URLParamXXX calls.
	// the underline application app.
	app Application
	// the route's handlers
	handlers Handlers
	// the current position of the handler's chain
	currentHandlerIndex int
	// proceeded reports whether `Proceed` method
	// called before a `Next`. It is a flash field and it is set
	// to true on `Next` call when its called on the last handler in the chain.
	// Reports whether a `Next` is called,
	// even if the handler index remains the same (last handler).
	proceeded uint32
}


====》〉》〉 然后我门在看这个设置到底是谁的设置
//  +------------------------------------------------------------+
//  | Response Headers helpers                                   |
//  +------------------------------------------------------------+

// Header adds a header to the response, if value is empty
// it removes the header by its name.
func (ctx *Context) Header(name string, value string) {
	if value == "" {
		ctx.writer.Header().Del(name)
		return
	}
	ctx.writer.Header().Add(name, value)
}

====》〉》〉 这一步还是看不出来,但是 我们能找到这个 ctx.writer,  writer 是重点
==》〉那我们继续看
type Context struct {
	// the http.ResponseWriter wrapped by custom writer.
	writer ResponseWriter
	
==》〉他是 ResponseWriter
也就是说,iris的context封装了 ResponseWriter

但是kit的context 是原生 context,所以不可能封装这个属性,而且我们也不可能重重新把这个再一次封装一次,所以我只能去寻找这个设置

// NewServer constructs a new server, which implements http.Handler and wraps
// the provided endpoint.
func NewServer(
	e endpoint.Endpoint,
	dec DecodeRequestFunc,
	enc EncodeResponseFunc,
	options ...ServerOption,
) *Server {。。。}
这个方法,在kit中是最常见并且使用的函数,也是作为http的handle使用的,具体为啥后续说,
那我们需要解决的是跨域问题,而且是,我们需要在ResponseWriter中,进行设置属性,那我们就可以在这个NewService中进行查找,一定会有我们需要的 ResponseWriter,为什么?因为设计kit的人一定会想到这个问题而且ResponseWriter,是返回前端的响应,所以在httphandle中一定会有,所以,我们一个一个看,DecodeRequestFunc。type DecodeRequestFunc func(context.Context, *http.Request) (request interface{}, err error),这个明显是一个请求入口,不会有,EncodeResponseFunc:type EncodeResponseFunc func(context.Context, http.ResponseWriter, interface{}) error;嗯啊找到了,这是一个出口,而且我们找到了,那我们就可以设置属性,从而跨域问题解决;

在此,也提一下跨域问题,当前端出现跨域问题时,这个问题不一定出现在前端还是后端

跨域问题:我理解的有两种:
一:前端请求时,被浏览器拦截,前端直接报跨域问题,请求不会发送到后端
二:后端接收到请求,响应前端时,也被浏览器拦截,服务器不会报异常,但是前端回报异常,但这个时候后端是接收到了请求。

天才第一步,了解第一步