spring gateway、balance、openFeign关于nacos服务注册服务端context-path的解决方案

问题

如果服务端如果配置了
 

server:
  port: 8081
  servlet:
    context-path: xxxxx

对于nacos服务进行注册后,有可能因为  context-path 的问题导致 
 spring cloude gateway、

@LoadBalanced、

openFeign

三种负载均衡的方式 无法找到对应路径而出错


方案一:

采用nacos 服务注册带metadata参数方式

discovery:
        #server-addr: 192.168.100.254:8848
        group: CHRIS-GROUP
        weight: 1
        metadata:
          context-path: '${server.servlet.context-path}'
          scheme: "http"

 

但是只能手动读取拼凑,代码如下
private String GetUrl(String ServiceName)
    {
        //---方案1 loadBalancerClient---------
        //serviceId要在nacos的服务列表中
        ServiceInstance choose = loadBalancerClient.choose(ServiceName);
        String ip = choose.getHost();
        int port = choose.getPort();
        String scheme="http";
        String context_path="";
        if (choose.getMetadata().containsKey("scheme"))
            scheme=choose.getMetadata().get("scheme");

        if (choose.getMetadata().containsKey("context-path"))
            context_path=choose.getMetadata().get("context-path");

        String url = String.format("%s://%s:%s%s", scheme,ip,port,context_path);
        return url;
    }

有一定局限性,只合适纯手动自定义 获取服务发现模式,无法[自动]适配 gateway、@LoadBalanced、openFeign


方案二

在【方案一】基础上
openFeign解决方案
 

@FeignClient(name = "${var.dataid}" ,path = "${var.context-path}")//,contextId = "remoteProviderService"
@Service
public interface OpenfeignService {

    @GetMapping("/nacos/{id}")
    String nacos(@PathVariable("id") Integer id);

}

gateway解决方案
 

 routes: #手工定义路由
        -
          id: chris_route
          uri: lb://${var.dataid}
          predicates:
            - Path=/${context-path}/**




          #filters:
          #  - StripPrefix=1 #过滤第一级path

@LoadBalanced解决方案

restTemplate.getForObject("http://"+appName+context_path+"/" + id, String.class);

appName,context_path 从配置文件取

方案三(推荐)

采用约定大于配置原则,全局约定 

dataid = context-path

 

 

在【方案二】基础上
openFeign解决方案
 

@FeignClient(name = "${var.dataid}" ,path = "${var.dataid}")//,contextId = "remoteProviderService"
@Service
public interface OpenfeignService {

    @GetMapping("/nacos/{id}")
    String nacos(@PathVariable("id") Integer id);

}

gateway解决方案
 

 routes: #手工定义路由
        -
          id: chris_route
          uri: lb://${var.dataid}
          predicates:
            - Path=/${var.dataid}/**




          #filters:
          #  - StripPrefix=1 #过滤第一级path

@LoadBalanced解决方案

restTemplate.getForObject("http://"+dataid+"/"+dataid+"/" + id, String.class);

dataid从配置文件取

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值