当前位置: 首页 > 知识库问答 >
问题:

访问内部微服务

松昱
2023-03-14

我有两个不同的微服务,将尤里卡作为服务注册表,现在我正在尝试从另一个微服务调用微服务,解析带有功能区的endpoint以进行客户端负载平衡。

服务A:

此服务公开一个终结点,http://localhost:15000/api/user/{userId},并且应用程序.yml 如下所示:

# Spring properties
spring:
  application:
    name: user_microservice
  cloud:
    config:
      discovery:
        enabled: false

# HTTP Server
server:
  port: 15000  # HTTP (Tomcat) port



# Discovery Server Access
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
  instance:
    instanceId: ${spring.application.name}:${random.int}
    metadataMap:
      instanceId: ${spring.application.name}:${random.int}

logging:
  level:
    com.netflix.discovery: 'OFF'
    org.springframework.cloud: 'DEBUG'

调用服务A的服务B具有以下应用程序类:

@EnableDiscoveryClient
@SpringBootApplication
public class UserSummaryApplication {

    public static void main(String[] args) {

        SpringApplication.run(UserSummaryApplication.class, args);
    }

    @Bean(name = "restTemplate")
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Bean(name = "loadBalancedRestTemplate")
    @LoadBalanced
    RestTemplate loadBalancedRestTemplate() {
        return new RestTemplate();
    }
}

控制器

@RestController
@RequestMapping("/api/usersummary")
public class UserSummaryController {

    @Autowired
    private UserSummaryService userSummaryService;

    @RequestMapping(value="/{userId}", method= RequestMethod.GET)
    @ResponseStatus(HttpStatus.OK)
    public UserSummary getUserSummary(@PathVariable String userId){
        return userSummaryService.getUserSummary(userId);
    }
}

服务

@Service
public class UserSummaryService {

    // Uses Ribbon to load balance requests
    private RestTemplate loadBalancedRestTemplate;

    public UserSummary getUserSummary(String UserId){

        String url = String.format("http://%s%s","user_microservice","/api/user/{userId}");
        logger.info(url);
        try {
            return this.loadBalancedRestTemplate.getForObject(url,
                    User.class, UserId).toString();

        }catch (Exception e){
            e.printStackTrace();
            return null;
        }

    }

    @Autowired
    public void setLoadBalancedRestTemplate(RestTemplate loadBalancedRestTemplate) {
        this.loadBalancedRestTemplate = loadBalancedRestTemplate;
    }

}

但我在尝试访问服务时遇到了一个异常:

java.lang.IllegalStateException: Request URI does not contain a valid hostname: http://user_microservice/api/user/599f877c8e365c0001cec8d1
usersummary_microservice_1  |   at org.springframework.util.Assert.state(Assert.java:70)
usersummary_microservice_1  |   at org.springframework.cloud.client.loadbalancer.LoadBalancerInterceptor.intercept(LoadBalancerInterceptor.java:54)
usersummary_microservice_1  |   at org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:86)
usersummary_microservice_1  |   at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:70)
usersummary_microservice_1  |   at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
usersummary_microservice_1  |   at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)
usersummary_microservice_1  |   at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:652)
usersummary_microservice_1  |   at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
usersummary_microservice_1  |   at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:287)
usersummary_microservice_1  |   at com.haulmatic.usersummary.service.userSummaryService.getuserSummary(UserSummaryService.java:33)
usersummary_microservice_1  |   at com.haulmatic.usersummary.controller.userSummaryController.getuserSummary(UserSummaryController.java:29)
usersummary_microservice_1  |   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
usersummary_microservice_1  |   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
usersummary_microservice_1  |   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
usersummary_microservice_1  |   at java.lang.reflect.Method.invoke(Method.java:498)
usersummary_microservice_1  |   at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
usersummary_microservice_1  |   at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
usersummary_microservice_1  |   at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
usersummary_microservice_1  |   at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
usersummary_microservice_1  |   at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
usersummary_microservice_1  |   at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
usersummary_microservice_1  |   at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
usersummary_microservice_1  |   at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
usersummary_microservice_1  |   at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
usersummary_microservice_1  |   at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
usersummary_microservice_1  |   at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
usersummary_microservice_1  |   at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
usersummary_microservice_1  |   at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
usersummary_microservice_1  |   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
usersummary_microservice_1  |   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
usersummary_microservice_1  |   at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
usersummary_microservice_1  |   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
usersummary_microservice_1  |   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
usersummary_microservice_1  |   at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
usersummary_microservice_1  |   at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
usersummary_microservice_1  |   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
usersummary_microservice_1  |   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
usersummary_microservice_1  |   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
usersummary_microservice_1  |   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
usersummary_microservice_1  |   at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
usersummary_microservice_1  |   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
usersummary_microservice_1  |   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
usersummary_microservice_1  |   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
usersummary_microservice_1  |   at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
usersummary_microservice_1  |   at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
usersummary_microservice_1  |   at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
usersummary_microservice_1  |   at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
usersummary_microservice_1  |   at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
usersummary_microservice_1  |   at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
usersummary_microservice_1  |   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
usersummary_microservice_1  |   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
usersummary_microservice_1  |   at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
usersummary_microservice_1  |   at java.lang.Thread.run(Thread.java:748)

对此有什么建议吗?

共有1个答案

章彬郁
2023-03-14

下划线 (_) 在主机名中无效。使用短划线 (-) 命名服务。

new URI("http://user_microservice/stuff").getHost() // null
new URI("http://user-microservice/stuff").getHost() // user-microservice

因此,更改spring.application。name用户微服务,并更改客户端中的URL。

 类似资料:
  • 我正在使用microservies Architect学习API。下面是关于设置的小描述 我有两个微服务应用程序和API网关 包括API网关在内的所有应用程序都是NodeJS-Express app。 Auth Logic-JWT,在API网关上处理 使用http-proxy将每个传入的API网关请求传递给每个微服务应用程序。 还将用户信息作为代理头传递。 客户端请求流: 客户端使用JWT令牌从m

  • 我正在尝试从我的一个微服务攻击外部服务。我使用Spring Cloud、Eureka注册表和Spring boot作为主框架。 在我看来,Spring Cloud将Ribbon作为Rest模板的HTTP客户端注入,当我尝试访问这个IP(例如:)时,它会产生以下错误: java.lang.IllegalStateException:在org.springframework.cloud.netflix

  • 问题内容: 我正在尝试使用docker-compose启动kafka服务,并且应该可以在docker内部和外部进行访问。因此,应该在内部和外部设置合适的广告客户: 问题是,当我尝试从群集外部进行连接时,节点名称不是127.0.0.1,而是内部主机名: 这不是KAFKA_ADVERTISED_LISTENERS和KAFKA_LISTENERS处理这种情况的目的吗?我尝试设置KAFKA_ADVERTI

  • 我有多个微服务。客户端可以通过API网关调用这些微服务,微服务之间也可以相互通信。 理想情况下,请求将来自拥有所有权限的用户的API网关。例如,如果用户(浏览器)需要来自微服务A的数据,则只将该角色授予用户,如果内部微服务A需要来自B的数据(rest call),则不应将该角色分配给用户。 要求:如何限制/授权微服务之间的内部通信,以便只有经授权的微服务才能呼叫其他服务。 选项: > 将所有角色分

  • 我运行了keybeave实例 然后参观http://localhost:8080/auth/realms/master/protocol/openid-连接/令牌,获取内部服务器错误: 所以 > 哪里出错了,如何修复内部服务器错误?

  • 我无法从外部访问我的服务。首先,这里是我的conf yaml文件: nginx-pod.yaml nginx-service.yaml metallb-config.yaml 然后我创建了集群。命令 打印: 一切正常,而且< code > ku bectl describe service/nginx-service 打印: curl命令在主服务器打印。接下来我试图从另一个网络打开,它不起作用,但