当采用微服务架构时,各个业务流程被逐一分解,虽说是分解,但还是要进行连接的,最简单的就是使用http请求,将他们联系起来,通过给容器注入restTemplate,然后使用内置的方法进行请求,但是在请求过程中,难免就会涉及请求地址,请求路径之类,而这些变量是会随之改变的,也就是常说的硬编码,要改就要整个路劲都改了。而通过使用我们的eureka就可以解决这类,问题:
在eureka中,不是根据项目的路径进行寻找,而是通过在yaml文件中定义的项目名称,一个名称可以对应多个项目,使用负载均衡算法,可以优化对同名项目的调用情况。使用eureka的流程首先就是对各个流程服务进行注册,当需要哪个服务时,就指明目标项目名称,来我们的eureka里面拿。由eureka统一管理,这样就可以减少硬编码带来的不便。使用eureka也是极其简单,只需要三步:
第一步:创建eureka服务的服务,专门用来管理所有的注册信息:
在该模块中需要导入如下pom:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
然后在其启动类中,需要加入如下注解(@EnableEurekaServer),就可以开启eureka服务,注意此处是服务端!
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
配置yaml文件(规定允许的端口号,项目名称,还有这个服务端的路径,供其他业务进行注册使用):
server:
port: 1008
spring:
application:
name: eurekaserver
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:1008/eureka
第二步,对需要由eureka管理的服务导入如下pom,注意此处的服务为客户端,需要使用eureka来管理自己的服务:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
配置客户端的yaml文件(给项目起名,还有注册的路径):
spring:
application:
name: orderserver
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
第三步,也就是客户端通过eureka拉取其他客户端的数据,此处使用向eureka发送http请求,不需要通过路径而是通过项目名称进行访问。以下是在service层的示例代码:
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//以下的http后跟着项目的名称即可访问
String url = "http://userserver/user/" + order.getUserId();
User user = restTemplate.getForObject(url,User.class);
order.setUser(user);
// 4.返回
return order;
}
如此下来便可以通过eureka完成微服务架构间的联系了!
效果如下(所有在线的服务都会在最下方位置出现,同名服务采用负载均衡调整被调用):