Spring Cloud Gray Sample 调试记录

依次运行应用

1
2
3
4
5
6
7
8
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 &

修改数据库编码

1
ALTER DATABASE gray_service CHARACTER SET utf8 COLLATE utf8_general_ci;

在管控端数据库添加管理员账号,用户名:admin 密码:abc123

1
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

1
2
3
4
5
6
7
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;

管控端前端部署

1
2
$ npm i
$ npm run dev

测试访问路径

日志及报警

(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级别日志,可以不用过滤

1
2
3
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<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)灰度决策和灰度追踪中的自定义名称:是指自己扩展的GrayDecisionFactoryGrayInfoTracker

(16)灰度决策中的Attribute和Attributes配置:是自定义的一些信息,并不是从请求中直接获取的。在业务代码中,或者是Filter, Interceptor等进行定义配置

(17)TrackAttribute:根据灰度追踪记录的属性值进行判断

(18)默认情况下POST参数是不是不可以追踪:如果是requestbody中的参数,建议不要追踪,但querystring中的参数可以设计追踪

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2021 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :