Go语言微服务开发框架实践-go chassis(中篇)

本篇将主要介绍go chassis的重要功能,生态对接 

注册中心

在Eureka宣布停止维护之前,其实已经能够看到平台发现会代替客户端注册成为主流的运行模式这样的趋势,类似Kubernetes这样的平台在部署后会帮你自动维护生命周期,而不再是类似Eureka这样的需要微服务使用开发框架自行注册,并不断维护微服务心跳。

Go chassis将过去的Registry接口拆分,重新设计为2个组件Registrator与ServiceDiscovery


ServiceDiscovery为必选组件,当离开平台时可以通过启用Registrator来或者自注册和上报心跳的能力(目前仅支持ServiceComb service center)

服务发现积极拥抱了不同生态对接了Istio0.8 和kubernetes。

而在这之上维护了统一的缓存模型,以使路由管理能够通用于不同的注册中心。


这样设计无论是容器平台还是VM等基础设施都可以适应,加强了go chassis的通用性。



路由管理


Go chassis抽象了router管理接口,可以对接不同生态系统,将这些配置转换为统一的标准路由定义模型

目前有2个实现:

- 对于非istio环境,可以使用携程开源的apollo进行路由管理,学习go chassis的配置语法即可

- 支持Istio控制面,如果你已经有Istio了,那么你可以用原生的Istio流量管理来管理go chassis的路由定义。

过程如下:

1.  请求具有特征,其中最重要的就是Service Name,即要访问的服务,根据请求特征进入路由定义进行匹配,得到他访问的具体服务是什么样的,服务具有怎么样的metadata。

2. 根据Service Name即metadata确定一批服务实例

3. 传到负载均衡进行实例选取

比如

•系统中稳定运行着A服务,版本是1.0,最近新上线了1.1版本,你希望只让一部分用户进行体验,那么你可以定义Header带有device-os=android就将95%流量转移版本为1.0的实例中,5%转移到1.1版本。

•请求者的元数据中带有env=production,那么要将路由到元数据中带有env=production的实例中

基于元数据的路由管理十分灵活。

多协议支持

在运行态go chassis将协议转为统一的模型Invocation来处理协议,以此让所欲接入的协议都能复用负载均衡,路由,限流,分布式追踪等能力。在网络传输时在转会标准协议请求发出。



配置中心

go chassis使用了go-archaius作为开发库,可以支持本地文件及远程配置中心中的配置管理。

以此来实现配置(熔断,限流,负载均衡,容错)变更0宕机时间。可以通过Apollo前台来进行配置下发。https://go-chassis.readthedocs.io/en/latest/user-guides/apollo-chassis.html

同时archaius的API也完全面向开发者,允许业务代码使用进行配置管理。

分布式配置管理是个比较大的话题,关于go archaius我将在另一篇章中介绍。


总结

本章节剖析了go chassis内部组件设计的细节,在下一篇章中,将分享性能调优的一些知识

go chassis项目地址:https://github.com/go-chassis/go-chassis

go archaius项目地址: https://github.com/go-chassis/go-archaius



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解释这段代码static void chassis_control_loop(chassis_move_t *chassis_move_control_loop) { fp32 max_vector = 0.0f, vector_rate = 0.0f; fp32 temp = 0.0f; fp32 wheel_speed[4] = {0.0f, 0.0f, 0.0f, 0.0f}; uint8_t i = 0; float position_error, speed_error; float position_output, speed_output; float current_position, current_speed; float target_position, target_speed; chassis_move_control_loop->vx_set=vx_set; chassis_move_control_loop->vy_set=vy_set; chassis_move_control_loop->wz_set=angle_set; chassis_vector_to_mecanum_wheel_speed(chassis_move_control_loop->vx_set, chassis_move_control_loop->vy_set, chassis_move_control_loop->wz_set, wheel_speed); if (chassis_move_control_loop->chassis_mode == CHASSIS_VECTOR_RAW) { for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].give_current = (int16_t)(wheel_speed[i]); } } for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].speed_set = wheel_speed[i]; temp = fabs(chassis_move_control_loop->motor_chassis[i].speed_set); if (max_vector < temp) { max_vector = temp; } } if (max_vector > MAX_WHEEL_SPEED) { vector_rate = MAX_WHEEL_SPEED / max_vector; for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].speed_set *= vector_rate; } } for (i = 0; i < 4; i++) { PID_Calc(&chassis_move_control_loop->motor_speed_pid[i], chassis_move_control_loop->motor_chassis[i].speed, chassis_move_control_loop->motor_chassis[i].speed_set); } for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].give_current = (int16_t)(chassis_move_control_loop->motor_speed_pid[i].out); } }
03-26

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值