将RestTemplate与服务发现结合使用
实际上,与服务发现的集成是Ribbon客户端的默认行为。细心的读者可能还记得,我们可以通过设置ribbon.eureka. enabled属性为false禁用Eureka作为客户端均衡器的功能。在本节示例中开发人员将看到,服务发现的存在简化了对于服务之间通信的SpringCloud组件的配置任务。
本示例的系统架构与前一个示例相同。要查看当前练习的源代码,必须切换到ribbon_ with_ discovery 分支
ttp://github.com/piomin/shown here-spring-cloud-comm/tree/ribbon_ with. _discovery) 。在这里,开发人员将看到的第一件 事是新模块,即discovery-service (发现服务)。本书第4章“服务发现”详细讨论了与Eureka 相关的几乎所有方面,因而启动它时不应该有任何问题。我们需要运行一个具有真正基本设置的独立Eureka服务器,它在默认端口8761上可用。
与前面的示例相比,我们应该删除与Ribbon客户端严格相关的所有配置和注解。取而代之的是,Eureka 发现客户端必须使用@EnableDiscoveryClient启用,并且必须在applicationyml文件中提供Eureka服务器地址。现在,order-service 的main类看起来应该如下所示。
@SpringBootApplication
@EnableDiscoveryClient
public class OrderApplication {
QLoadBalanced
@Bean
RestTemplate restTemplate() (
return new RestTemplate() ;
public static void main (Stringl] args)1
new
SpringApplicationBuilder (OrderApplication.class) .web(true) .run (args);
}
//...
}
以下是当前的配置文件。可以使用spring, application.name属性来设置服务的名称。
spring:
application:
name: order-service
server:
port: ${PORT:8090}
eureka:
client:
serviceUrl:
defaultZone: $(EUREKA URL:http://localhost:8761/eureka/}
这里的设置和以前是一样的。我们还启动了所有的微服务。但是,这一次account-service服务和product-service服务的实例数将乘以2。启动每个服务的第二个实例时,可以使用-DPORT或-Dserver.port参数覆盖默认服务器端口,如java -jar -DPORT-9093product- srvice-1.0-SNAPSHOTjar.所有实例都已在Eureka 服务器中注册,这可以使用其UI仪表板轻松查看,如图6.2所示。
这是本书第一次看到负载均衡的实际示例。默认情况下,Ribbon 客户端将在微服务的所有已注册实例之间平均分配流量。该算法称为轮询调度(Round Robin)。实际上,这意味着客户端会记住它转发的最后一个请求的位置,然后将当前请求发送到该行中的下一个服务。这个方法可能会被本书第7章所介绍的其他规则覆盖。通过在ribbon.listOfServers中设置以逗号分隔的服务地址列表,也可以为没有服务发现机制的