Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot Spring Boot-如何在微服务之间通信?_Spring Boot_Microservices - Fatal编程技术网

Spring boot Spring Boot-如何在微服务之间通信?

Spring boot Spring Boot-如何在微服务之间通信?,spring-boot,microservices,Spring Boot,Microservices,我目前正在从事一个SpringBoot微服务项目。我已经创建了服务,每个服务都单独运行。这样,我需要一些服务来与其他服务通信。我怎样才能做到这一点 我看到一些关于这方面的博客,它们使用Netflix、Eureka云服务器来实现这一点。在我的本地环境中,是否有任何方法可以在不使用云服务器的情况下实现这一点?正如@g00glen00b在评论中提到的那样,Eureka不用于微服务之间的通信。它用于服务发现。 我知道有两种方法可以让您与其他微服务进行通信: RestTemplate 假客户 RestTe

我目前正在从事一个SpringBoot微服务项目。我已经创建了服务,每个服务都单独运行。这样,我需要一些服务来与其他服务通信。我怎样才能做到这一点


我看到一些关于这方面的博客,它们使用Netflix、Eureka云服务器来实现这一点。在我的本地环境中,是否有任何方法可以在不使用云服务器的情况下实现这一点?

正如@g00glen00b在评论中提到的那样,Eureka不用于微服务之间的通信。它用于服务发现。 我知道有两种方法可以让您与其他微服务进行通信:

  • RestTemplate
  • 假客户
  • RestTemplate使用起来非常简单。它不需要配置

    e、 g

    url-url

    responseType—返回值的类型

    params-展开模板的变量

    Spring文档供您参考

    当然可以。 微服务只是REST服务。 您需要了解REST服务是如何工作的。 在这之后,只需使用Spring boot编写2个微服务(2个Rest服务:生产者服务和消费者服务),让它们在不同的服务器端口下运行,从另一个端口调用消费者服务,就这样:您拥有了您的微服务。 这是编写微服务的原始方法

    要使它们不断发展,您需要添加一些“魔法”(无火箭科学),例如使用Ribbon在“生产者服务”的两个实例之间分配负载

    您可以使用一个发现服务,它只是一个带有注释@EnableEurekaServer的spring引导应用程序(您需要在pom中添加适当的依赖项) 现在,将注释@EnableDiscoveryClient添加到主类的第一个(基本)微服务中,并在两者的application.properties(或application.yml)中添加指向您的eureka服务的defaultZone,启动您的eureka服务(发现服务)和2个微服务:它们将在发现服务上注册。当然,现在您不需要在消费者服务中硬编码生产者服务的http地址。
    看看这个

    于2018年11月21日12:41 GMT编辑

    假设您的第一个(琐碎的)微服务(纯rest服务)正在您的PC上端口8091下运行

    在第二个(普通)微服务的控制器中,使用RestTemplate.getForEntity(url、responseType、uriVariables)调用第一个服务,如链接教程中的示例所示:

    ResponseEntity<CurrencyConversionBean> responseEntity = 
       new RestTemplate().getForEntity(
            "http://localhost:8091/currency-exchange/from/{from}/to/{to}", CurrencyConversionBean.class,  uriVariables);
    
    ResponseEntity ResponseEntity=
    新建RestTemplate().getForEntity(
    "http://localhost:8091/currency-交换/from/{from}/to/{to}”,CurrencyConversionBean.class,uriVariables);
    
    在哪里 url:您的第一个(微)(rest)服务的url。 responseType:作为响应等待的对象的类/类型。
    uriVariables:是一个包含URI模板变量的映射

    微服务之间有不同的通信方式。但是使用哪一个:取决于用例

  • Api调用
    :即使用
    restemplate
    假装客户端
    等对其他服务进行实际的restapi调用
  • 但是,如果用例不同,比如,您有客户微服务和订单微服务,它们都使用单独的数据库。您在
    订单
    数据库中还有
    客户名称
    和其他详细信息。客户更新其姓名后,您还必须更新订单数据库中的详细信息。如何做到这一点。通过
    API调用
    ?如果帐户微服务也需要此更新,该怎么办。所以RESTAPI将是一个开销。在这个用例中,我们可以像
    RabbitMQ
    一样使用
    MessageQueues
    。Customer microservice将创建一个Customer update事件,microservice对此感兴趣的用户可以订阅该事件
  • 通过消息队列(如RabbitMQ)进行通信

    资料来源:


    尽管REST很熟悉,因此易于实现,但如果您需要更灵活和类似Java的通信,Spring的(Spring-to-Spring)
    HTTP Invoker
    可能是一个不错的选择

    如果您需要基于HTTP的远程处理,Spring的HTTP调用程序是一个不错的选择 但也依赖于Java序列化。它共享基本的 具有RMI调用程序的基础架构,仅使用HTTP作为传输。注 HTTP调用程序不仅限于Java到Java远程处理,而且 也可以在客户端和服务器端使用Spring。(后者也是如此。) 适用于非RMI接口的Spring的RMI调用程序。)


    这篇文章似乎很老,但我将尝试与那些寻找相同问题解决方案的新开发人员分享我的经验

    您将需要这些库: 祖尔网关, 尤里卡发现服务器, 尤里卡发现客户端, Rest模板(如果您开发RESTAPI)

    网关可以管理spring boot microservice应用程序的所有路由。仅使用注释和application.properties可以设置整个服务器。您不需要编写单行Java代码

    发现服务器在启动或停止新的微服务时进行侦听。它注册所有带有@EnableEurekaClient注释的微服务

    Rest模板是一个成熟的Rest客户端库,在自定义http请求和http响应配置方面非常灵活。例如,您可以使用客户端http拦截器配置来拦截http请求和响应,以添加更多数据或日志信息等

    我的GitHub页面上有开源的微服务应用程序。免费分发、分叉、克隆、商业化。。无欲:-)


    一切都好。

    这取决于您的选择,您希望在服务之间进行同步通信还是异步通信。 对于同步服务,您可以使用以下任一第三方
    ResponseEntity<CurrencyConversionBean> responseEntity = 
       new RestTemplate().getForEntity(
            "http://localhost:8091/currency-exchange/from/{from}/to/{to}", CurrencyConversionBean.class,  uriVariables);
    
    ResponseType obj=  new RestTemplate().getForObject(URL, ResponseType.class, params);
    
    @Autowired
        private RestTemplate restTemplate;
    
    @Autowired
        private EurekaClient eurekaClient;
    
    
    @RequestMapping("/dashboard/{myself}")
        public EmployeeInfo findme(@PathVariable Long myself) {
            Application application = eurekaClient.getApplication(employeeSearchServiceId);
            InstanceInfo instanceInfo = application.getInstances().get(0);
            String url = "http://" + instanceInfo.getIPAddr() + ":" + instanceInfo.getPort() + "/" + "employee/find/" + myself;
            System.out.println("URL" + url);
            EmployeeInfo emp = restTemplate.getForObject(url, EmployeeInfo.class);
            System.out.println("RESPONSE " + emp);
            return emp;
        }