首页 > 其他 > 详细

微服务 ribbon 不同服务访问,出现访问一个服务,另外一个服务访问不了

时间:2021-04-15 12:23:50      阅读:17      评论:0      收藏:0      [点我收藏+]

问题描述:

有两个不同 服务 A 和 B  调用服务A正常,服务 B 就被挤掉,导致访问服务B 失败,出现404 访问代码如下

/**
* 通过拼接路径访问服务端
* @param ClientName
* @param ClientMoth
* @param object
* @return
*/
@HystrixCommand(fallbackMethod = "PostServicesinfo")
public Object PostServices(String ClientName, String ClientMoth, JSONObject object) {

object.putIfAbsent("FAction",ClientName+"/"+ClientMoth);
//获取服务实例
List<ServiceInstance> list=discoveryClient.getInstances("ClientName");
String uri="";
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> requestEntity = new HttpEntity<String>(JSONObject.toJSONString(object) , requestHeaders);
String url = String.format("http://%s/%s", ClientName, ClientMoth);
//使用注册到Eureka服务中心的客户端,由客户端分配具体调用哪个服务
Object obj =restTemplate.postForObject(url,requestEntity,Object.class);
return obj;
}

找了一下原因后发现,配置出现了问题,配置如下

1.新增俩个配置类型  CloudRole ,RibbonClientConfig

技术分享图片

 

 2 CloudRole 配置 设置注解

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.*;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
**
* 该类为Ribbon的配置类
* 注意:该类不应该在主应用程序上下文的@ComponentScan中
*/
@Configuration
public class CloudRole {

/**
* 自定义调用规则(服务提供者掉线后不再调用,解决轮询问题)
* @return
*/
@Bean
public IRule myRule() {
//1、先按照RoundRobinRule(轮询)的策略获取服务,如果获取的服务失败侧在指定的时间会进行重试,进行获取可用的服务
//2、如多次获取某个服务失败,这不会再再次获取该服务如(高德地图上某条道路堵车,司机不会走那条道路)
//return new RetryRule();


//线性轮询
//return new RoundRobinRule();
//可以重试的轮询
//return new RetryRule();
//根据运行情况来计算权重
//return new WeightedResponseTimeRule();
//过滤掉故障实例,选择请求数最小的实例
//return new BestAvailableRule();
return new RandomRule();

}



//IPing
@Bean
public IPing iping() {
return new DummyPing();
}



//服务列表过滤器
@Bean
public ServerListSubsetFilter serverListFilter() {
ServerListSubsetFilter filter = new ServerListSubsetFilter();
return filter;
}


}

 3.RibbonClientConfig 

import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Configuration;

@Configuration
@RibbonClients(defaultConfiguration = CloudRole.class)
public class RibbonClientConfig {
}

4.application.yml 配置
eureka:
client:
serviceUrl:
#defaultZone: http://localhost:8761/eureka/
defaultZone: http://172.172.172.45:8761/eureka/
#请求处理的超时时间 秒
eureka-server-read-timeout-seconds: 6
#请求连接超时时间 秒
eureka-server-connect-timeout-seconds: 5
instance:
lease-expiration-duration-in-seconds: 3
lease-renewal-interval-in-seconds: 5
#lease-renewal-interval-in-seconds 每间隔1s,向服务端发送一次心跳,证明自己依然”存活“
#lease-expiration-duration-in-seconds  告诉服务端,如果我2s之内没有给你发心跳,就代表我“死”了,将我踢出掉。
#设置当前实例的主机名称
hostname: localhost
#部署到别的服务添加
instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
prefer-ip-address: true

欢迎留言 一起学习 一起探讨

微服务 ribbon 不同服务访问,出现访问一个服务,另外一个服务访问不了

原文:https://www.cnblogs.com/lx727408661/p/14661010.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!