微服务调试负载小记
在我们微服务中,通常在调试阶段,如果人员多并且我们使用同一服务注册地址,将出现调试自己本地代码,跳转到别人电脑去的情况,对于上述情况我们大致有以下几种解决方案
方案一
nacos分组
使用nacos,组员建立对应分组,并把本地微服务注册到自己分组进行处理
方案二
多点几下
哈哈哈,就是字面意思,多点几下,因为使用的是负载机制,多点几下就路由到你的pc了
人少的时候可以使用这种方式,懒人必备~
方案三
代码层面
重写路由规则
public class CustomRibbonRule extends AbstractLoadBalancerRule {
@Value("${shuhai.ribbon.local.enable:false}")
private boolean ribbonLocalEnable;
@Value("${shuhai.ribbon.local.host:}")
private String ribbonLocalHost;
public CustomRibbonRule() {
}
@SuppressWarnings({"RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE"})
public Server choose(ILoadBalancer lb, Object key) {
if (lb == null) {
return null;
} else {
Server server = null;
while (server == null) {
if (Thread.interrupted()) {
return null;
}
List<Server> upList = lb.getReachableServers();
List<Server> allList = lb.getAllServers();
int serverCount = allList.size();
if (serverCount == 0) {
return null;
}
// TODO: 2021/3/27 更改负载机制,包含自己host则走本地 调试用
if (ribbonLocalEnable && StrUtil.isNotEmpty(ribbonLocalHost)) {
for (Server server1 : allList) {
if (ribbonLocalHost.equals(server1.getHost())) {
server= server1;
break;
}
}
} else {
int index = this.chooseRandomInt(serverCount);
server = (Server) upList.get(index);
}
if (server == null) {
Thread.yield();
} else {
if (server.isAlive()) {
return server;
}
server = null;
Thread.yield();
}
}
return server;
}
}
protected int chooseRandomInt(int serverCount) {
return ThreadLocalRandom.current().nextInt(serverCount);
}
public Server choose(Object key) {
return this.choose(this.getLoadBalancer(), key);
}
public void initWithNiwsConfig(IClientConfig clientConfig) {
}
}
使用
@Configuration(proxyBeanMethods = false)
public class RibbonConfiguration {
@Bean
public IRule ribbonRule() {
//自定义负载规则
return new CustomRibbonRule();
}
}
启动类更改
增加@RibbonClient(name = "MICROCLOUDSERVICE-PROVIDER-HANGUANG", configuration = RibbonConfiguration.class)
@EnableFeignClients
@EnableBaseFeignInterceptor
@EnableDiscoveryClient
@RibbonClient(name = "MICROCLOUDSERVICE-PROVIDER-HANGUANG", configuration = RibbonConfiguration.class)
@SpringBootApplication(scanBasePackages = {"com.shuhai", "com.shuhai"})
public class SHGatewayApp {
public static void main(String[] args) {
SpringApplication.run(SHGatewayApp.class, args);
}
}
方案四
服务名称更改,并保持全局一致,个人调试在后面增加标识即可
以用户中心为例:sh-user-center
我花名为含光
本地调试即可更改为sh-user-center-hanguang
1、微服务名称全局定义
bootstrap.properties中
2、用户中心名称
3、@FeignClient使用
4、本地调试需要改动地方为
小结
综上所述,个人推荐方案四,即可以统一规范微服务名称,又便于维护、调试、