当采用微服务架构时,各个业务流程被逐一分解,虽说是分解,但还是要进行连接的,最简单的就是使用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完成微服务架构间的联系了!
效果如下(所有在线的服务都会在最下方位置出现,同名服务采用负载均衡调整被调用):