Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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
Java 微服务通信_Java_Spring_Rest_Spring Integration_Microservices - Fatal编程技术网

Java 微服务通信

Java 微服务通信,java,spring,rest,spring-integration,microservices,Java,Spring,Rest,Spring Integration,Microservices,我是微服务的新手,我正试图把我的项目变成一个基于微服务的项目。我的问题是弄清楚每个服务如何相互通信 首先,我探讨了REST风格的服务,但是如果每个服务都基于HTTPREST,那么它们到底如何“交谈”彼此呢 然后我尝试学习Spring集成,但后来变得更加不清楚它们应该如何通信,因为现在我想到,也许我需要使用RabbitMQ作为前端和微服务后端之间的中间件 我也接触过云技术和Docker技术,所以我想每个服务都应该在云上,但仍然没有明确说明服务是如何通信的 我正在使用Java和Spring技术 如果

我是微服务的新手,我正试图把我的项目变成一个基于微服务的项目。我的问题是弄清楚每个服务如何相互通信

首先,我探讨了REST风格的服务,但是如果每个服务都基于HTTPREST,那么它们到底如何“交谈”彼此呢

然后我尝试学习Spring集成,但后来变得更加不清楚它们应该如何通信,因为现在我想到,也许我需要使用RabbitMQ作为前端和微服务后端之间的中间件

我也接触过云技术和Docker技术,所以我想每个服务都应该在云上,但仍然没有明确说明服务是如何通信的

我正在使用Java和Spring技术


如果有人能给我一个更好的情况,我会很高兴的。

微服务的通信或传输机制没有标准。一般来说,微服务使用广泛采用的轻量级协议(如HTTP和REST)或消息传递协议(如JMS或AMQP)相互通信。在特定情况下,可以选择更优化的通信协议,如Thrift、ZeroMQ、协议缓冲区或Avro

微服务之间的通信可以设计为同步(请求-响应)或异步(触发-忘记)方式。这两种方法都有各自的优点和局限性。仅仅用一种方法开发一个系统是不可能的。基于用例,这两种方法需要结合使用


您应该根据您的用例和需求来选择最适合您的项目。

您走上了正确的道路。使用REST体系结构公开服务功能强大且简单。每个微服务都公开了一些其他微服务可以调用的功能。您可以使用SpingMVC和注释@RestController来实现这一点。要调用RESTAPI,可以使用Spring类RestTemplate

您可能还需要一个将请求重定向到正确服务的网关。我建议您尝试Netflix云堆栈:

  • 祖尔。这是应用程序的入口点。每一个请求都是向它发出的。它应该协调整个生态系统
  • Eureka客户端-Eureka服务器。您的所有微服务都应该以某种方式告诉某人,它们已启动并正在运行,可以接受请求。因此,您可以使用Eureka服务器接受来自您的服务的注册,并将您的微服务标记为客户端
  • 丝带。另一个重要的事情是请求的负载平衡。使用Ribbon,您可以轻松完成此操作
如果您使用的是SpringBoot,您可以通过一些注释快速设置此体系结构


您可以在这里找到一个简单的示例:

我个人使用了Eureka发现服务。如果你愿意的话,这基本上就是微服务的“傀儡大师”。启动时,每个微服务将自己注册到单独的微服务(发现服务)。因此,发现服务知道每个微服务的地址和端口,每个微服务可以询问发现服务注册了哪些(其他)微服务。此外,每个微服务都可以简单地向发现服务询问有关另一个微服务的信息。所有的通信(在我的例子中)都是用REST完成的,但这是一种选择,因为带有Eureka发现服务依赖项的Spring Boot促进了它

只需很少的配置,就可以使整个框架正常运行


这是基于Netflix使用的框架。我相信Eureka甚至是一个netflix库。

我真的不喜欢从服务a直接调用服务B,或者从服务B直接调用API,原因有二。首先,它在服务A和B之间创建了依赖关系。其次,随着服务数量的增加,它很容易创建一种杂乱无章的关系。我希望看到的是一种发布/订阅模式,例如,服务a将消息发布到传输层(RabbitMQ是一个不错的选择),然后继续。用于解释消息的订阅和业务逻辑被很好地封装在服务B中。通过这样做,服务B根本不需要了解服务A的任何信息,但他们可以很好地相互交谈。

让微服务进行同步通信是一种风险,最大的问题是耦合,这意味着服务现在彼此耦合,如果其中一个出现故障,则其依赖项现在将完全或部分禁用/崩溃,更好的解决方案是使用异步通信进行状态更改操作

您希望明确区分状态更改操作和读取操作(CQS命令查询分离)。对于更改状态的操作,您可以使用某种消息传递基础设施,并使用fire and forget通信。对于查询,您可以使用同步请求-响应通信,也可以使用http API或直接转到数据存储

如果您使用的是消息传递,那么还可以查看发布-订阅以在服务之间引发事件

另一个要考虑的问题是(事务性)数据共享(而不是只读视图)如果你暴露了你的内部状态,读者可能会得到错误的数据状态,或者错误的版本,也会潜在地锁定你的数据。 最后但并非最不重要的一点是,尽一切努力保持服务的自治性(至少在逻辑级别)

希望这是有意义的