解决方法:
服务注册yml中在元数据中添加context-path地址,服务调用的时候拼接上该地址。 服务controller
package com.demo.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class DeptController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/echo/{string}")
public String getPayment(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
服务提供者yml
server:
port: 8082
servlet:
context-path: /SpringCloudDemo
session:
timeout: 1800
tomcat:
uri-encoding: UTF-8
compression:
enabled: true
min-response-size: 1024
spring:
application:
name: service-provider
cloud:
nacos:
discovery:
server-addr: http://localhost:8848
metadata:
context-path: ${server.servlet.context-path}
注册成功后nacos存储的信息 服务调用的controller
package com.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
public class TestController {
@Resource
private LoadBalancerClient loadBalancerClient;
@Resource
private RestTemplate restTemplate;
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
public String echo(@PathVariable String str) {
ServiceInstance serviceInstance = loadBalancerClient.choose("service-provider");
String ip = serviceInstance.getHost();
int port = serviceInstance.getPort();
String context_path = serviceInstance.getMetadata().get("context-path");
String result = restTemplate.getForObject("http://" + ip + ":" + port + context_path+"/echo/" + str,String.class);
return result;
}
}
|