zero-contrib icon indicating copy to clipboard operation
zero-contrib copied to clipboard

Support service governance by polaris

Open andrewshan opened this issue 3 years ago • 12 comments
trafficstars

andrewshan avatar May 13 '22 06:05 andrewshan

image

andrewshan avatar May 13 '22 07:05 andrewshan

对接策略

服务注册

提供注册函数,实现go-zero的函数接口,自动将服务和节点注册到北极星 type ( // RegisterFn defines the method to register a server. RegisterFn func(*grpc.Server) )

服务发现

提供resovler的实现,对接北极星polaris-go的getallinstances,获取服务下全部实例信息

路由、负载均衡、故障熔断

提供balancer的实现,新增picker,根据请求参数走路由和负载均衡,分别调用polaris-go的processRouter和processloadbalancer 同时增加pickResult的Done回调,进行调用结果上报,对接故障熔断

andrewshan avatar May 13 '22 08:05 andrewshan

限流

限流能力的对接比较麻烦,主要存在以下2个问题:

  • gozero当前封装了interceptor,无法传入外部的interceptor,所以没法再服务端进行拦截
  • gozero提供了Breaker接口,但是Breaker并没有开放定制能力,没法通过外部定制来插入

andrewshan avatar May 13 '22 08:05 andrewshan

对于 Breaker 的接入,go-zero 这里是不是可以考将 Breaker 的创建动作也作为一个 Option 入参,

func NewBreaker(supplier func() Breaker, opts ...Option) Breaker {
	b := supplier()
	for _, opt := range opts {
		opt(b)
	}
	// if len(b.name) == 0 {
	// 	b.name = stringx.Rand()
	// }
	// b.throttle = newLoggedThrottle(b.name, newGoogleBreaker())

	return &b
}

chuntaojun avatar May 13 '22 09:05 chuntaojun

我们可以约个时间沟通一下?

kevwan avatar May 14 '22 07:05 kevwan

对接策略

服务注册

提供注册函数,实现go-zero的函数接口,自动将服务和节点注册到北极星 type ( // RegisterFn defines the method to register a server. RegisterFn func(*grpc.Server) )

服务发现

提供resovler的实现,对接北极星polaris-go的getallinstances,获取服务下全部实例信息

路由、负载均衡、故障熔断

提供balancer的实现,新增picker,根据请求参数走路由和负载均衡,分别调用polaris-go的processRouter和processloadbalancer 同时增加pickResult的Done回调,进行调用结果上报,对接故障熔断

注册发现应该是比较容易的,注册直接可以提供一个模块就好了,发现可以通过提供一个类似于现有 p2c 的方式注册进去就好了。

kevwan avatar May 14 '22 07:05 kevwan

限流

限流能力的对接比较麻烦,主要存在以下2个问题:

  • gozero当前封装了interceptor,无法传入外部的interceptor,所以没法再服务端进行拦截
  • gozero提供了Breaker接口,但是Breaker并没有开放定制能力,没法通过外部定制来插入

我是有计划暴露中间件定制能力的,但是polaris的限流有何优势呢?

kevwan avatar May 14 '22 07:05 kevwan

限流

限流能力的对接比较麻烦,主要存在以下2个问题:

  • gozero当前封装了interceptor,无法传入外部的interceptor,所以没法再服务端进行拦截
  • gozero提供了Breaker接口,但是Breaker并没有开放定制能力,没法通过外部定制来插入

我是有计划暴露中间件定制能力的,但是polaris的限流有何优势呢?

1、首先polaris的限流规则是动态的,可以从控制面下发最新的限流规则 2、限流可以按照流量标签进行控制 3、限流可以区分为单机限流、分布式限流 4、限流的效果具有快速失败以及匀速排队

chuntaojun avatar May 14 '22 08:05 chuntaojun

现在的breaker只是自适应根据后面调用返回来熔断的,其实我觉得可以直接添加interceptor就好了,因为内置breaker可以充当外层保护,只有有问题时才会触发。

我们可以讨论讨论。

kevwan avatar May 14 '22 10:05 kevwan

是的,我也觉得直接添加interceptor比较好,breaker语义更多还是做熔断降级

andrewshan avatar May 17 '22 07:05 andrewshan

@kevwan 这边大概什么时候可以开放interceptor的注入?

andrewshan avatar May 27 '22 09:05 andrewshan

已经啊

kevwan avatar May 27 '22 09:05 kevwan

This issue is stale because it has been open for 30 days with no activity.

github-actions[bot] avatar May 28 '23 02:05 github-actions[bot]

This issue was closed because it has been inactive for 14 days since being marked as stale.

github-actions[bot] avatar Aug 27 '23 02:08 github-actions[bot]