Spring Cloud Gray Sample 调试记录
依次运行应用
nohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-eureka-sample-C.1.0.1-SNAPSHOT.jar > eureka.log 2>&1 &
nohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-server-sample-C.1.0.1-SNAPSHOT.jar > server.log 2>&1 &
nohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-server2-sample-C.1.0.1-SNAPSHOT.jar > server2.log 2>&1 &
nohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-service-a-sample-C.1.0.1-SNAPSHOT.jar > service-a.log 2>&1 &
nohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-service-a1-sample-C.1.0.1-SNAPSHOT.jar > service-a1.log 2>&1 &
nohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-service-b-sample-C.1.0.1-SNAPSHOT.jar > service-b.log 2>&1 &
nohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-stream-sample-C.1.0.1-SNAPSHOT.jar > stream.log 2>&1 &
nohup java -Dfile.encoding=UTF-8 -jar spring-cloud-gray-zuul-sample-C.1.0.1-SNAPSHOT.jar > zuul.log 2>&1 &
修改数据库编码
ALTER DATABASE gray_service CHARACTER SET utf8 COLLATE utf8_general_ci;
在管控端数据库添加管理员账号,用户名:admin
密码:abc123
insert into `user` ( `user_id`, `account`, `name`, `password`, `roles`, `status`, `create_time`, `operator`, `operate_time`) values ( 'admin', 'admin', 'Admin', 'e7a57e51394e91cba19deca3337bfab0', 'admin', '1', now(), 'admin', now());
服务名长度限制改为64
ALTER TABLE `gray_service` CHANGE `service_id` `service_id` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
ALTER TABLE `user_service_authority` CHANGE `service_id` `service_id` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
ALTER TABLE `gray_track` CHANGE `service_id` `service_id` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
ALTER TABLE `gray_instance` CHANGE `instance_id` `instance_id` VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
ALTER TABLE `gray_instance` CHANGE `service_id` `service_id` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
ALTER TABLE `route_policy_record` CHANGE `resource` `resource` VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
ALTER TABLE `gray_event_log` CHANGE `source_id` `source_id` VARCHAR(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
管控端前端部署
$ npm i
$ npm run dev
测试访问路径
- zuul -> service-b -> service-a: http://127.0.0.1:20301/gateway/service-b/api/test/restTemplateGet
- zuul -> service-a: http://127.0.0.1:20301/gateway/service-a/api/test/get
- service-b -> service-a: http://127.0.0.1:20102/api/test/restTemplateGet
日志及报警
(1)日志过滤:ERROR [service-a,,,] 1082 --- [ling-1-thread-1] c.s.g.c.p.e.l.LongPollingWorker
否则重启Server端会有报警
(2)Load balancer does not have available server for client 不会产生ERROR
级别日志,可以不用过滤
WARN 28887 --- [io-20301-exec-3] o.s.c.n.z.filters.post.SendErrorFilter : Error during filtering
com.netflix.zuul.exception.ZuulException: Forwarding error
Caused by: com.netflix.client.ClientException: Load balancer does not have available server for client: service-b
服务发现
如果使用Nacos做服务发现,最合理的是将Eureka依赖排除掉,在gray-client-starter
中默认依赖了eureka-plugin
<dependency>
<groupId>cn.springcloud.gray</groupId>
<artifactId>spring-cloud-starter-gray-client</artifactId>
<version>${project.version}</version>
<exclusions>
<exclusion>
<groupId>cn.springcloud.gray</groupId>
<artifactId>spring-cloud-gray-plugin-webmvc</artifactId>
</exclusion>
</exclusions>
<exclusions>
<exclusion>
<groupId>cn.springcloud.gray</groupId>
<artifactId>spring-cloud-gray-plugin-eureka</artifactId>
</exclusion>
</exclusions>
</dependency>
相关问题
(1)服务列表中实例数和灰度数是定时去检查的,会滞后,不影响正常功能
(2)先启动微服务一段时间,在去启动gray-Server
。这种情况灰度不会立即生效,最长需要等一分钟
(3)spring-cloud-gray-client-netflix
中用到hystrix
。而公司框架限流用sentinel
。这种情况不用改造,hystrix
有线程池隔离模式需要特别扩展,sentinel
是使用信号量隔离的
(4)使用Nacos做服务发现,手动修改instance Status up -> down
修改成功。重新修改回来时候报错404
,这是因为Nacos没有找到重新将服务实例改为UP的接口
(5)track需要配全灰度追踪去用的。如果想在链路中传递,需要使用灰度追踪,最好是入口处,例如网关
(6)版本灰度使用eureka.instance.metadata-map.version
参数定义版本
(7)如果开启灰度实例,并且没有配置灰度策略,或者灰度策略不满足,则会路由到正常实例,如果正常实例不存在,则会报实例找不到错误
(8)决策删除Bug:删除决策,但取到的决策还是老的
解决:将del_flag=1
的决策配置全部删除再重启即可,需要重启server端和client端,配置删除这块感觉确实有个Bug
(9)灰度追踪只需配置上游链路,当前应用无需配置
(10)灰度追踪同一个配置务必配在一起,分开配有问题,如
- 正确:
HttpHeader: role,source
- 错误:
HttpHeader: role
+HttpHeader: source
,只有最新配置的有效
并且删除任意一条,会把那种类型的追踪全删了
(11)灰度追踪不能修改Name
字段,可以修改infos
信息
(12)IP追踪HttpIP的Infos
无需配置,留空即可
(13)使用版本灰度的话, 可以不用灰度锁定
(14)没用Docker instanctId可以确定,这样就可以先设置灰度锁定,打开灰度开关,就不会有正常流量访问。用了Docker需要注意instanceId,如果instanceId是随ip变化的话,就建议使用版本灰度
(15)灰度决策和灰度追踪中的自定义名称:是指自己扩展的GrayDecisionFactory
和GrayInfoTracker
(16)灰度决策中的Attribute和Attributes配置:是自定义的一些信息,并不是从请求中直接获取的。在业务代码中,或者是Filter
, Interceptor
等进行定义配置
(17)TrackAttribute
:根据灰度追踪记录的属性值进行判断
(18)默认情况下POST参数是不是不可以追踪:如果是requestbody中的参数,建议不要追踪,但querystring中的参数可以设计追踪
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/27/spring-cloud-gray-sample-debugging-record/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论