微服务远程调用
在order-service的OrderApplication中注册RestTemplate
在查询订单信息时,需要同时返回订单用户的信息,但是由于微服务的关系,用户信息需要在用户的微服务中去查询,故需要用到上面的RestTemplate来让订单的这个微服务去模拟浏览器去访问用户微服务暴露的接口去查询用户信息
故在订单这个微服务的service中,先调用订单的Mapper去查询订单信息,然后设置用户微服务的路由,利用RestTemplate提供的方法去根据这个路由访问用户微服务对外提供的接口,得到该订单对应的用户信息
调用查询订单信息的路由,查看101号订单,看到该订单的用户信息也被返回
总结
微服务调用方式
基于RestTemplate发起的http请求实现远程调用
http请求做远程调用是与语言无关的调用,只要知道对方的ip、端口、接口路径、请求参数即可
服务调用出现的问题
服务消费者该如何获取服务提供者的地址信息?
如果有多个服务提供者,消费者该如何选择?
消费者如何得知服务提供者的健康状态?
Eureka注册中心
Eureka的作用
消费者该如何获取服务提供者具体信息?
服务提供者启动时向eureka注册自己的信息
eureka保存这些信息
消费者根据服务名称向eureka拉取提供者信息如果有多个服务提供者,消费者该如何选择?
服务消费者利用负载均衡算法,从服务列表中挑选一个
消费者如何感知服务提供者健康状态?
服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态eureka会更新记录服务列表信息,心跳不正常会被剔除
消费者就可以拉取到最新的信息
总结
在Eureka架构中,微服务角色有两类:
EurekaServer:服务端,注册中心
记录服务信息
心跳监控
EurekaClient: 客户端
Provider:服务提供者,例如案例中的user-service注册自己的信息到EurekaServer
每隔30秒向EurekaServer发送心跳
consumer:服务消费者,例如案例中的 order-service
根据服务名称从EurekaServer拉取服务列表
基于服务列表做负载均衡,选中一个微服务后发起远程调用
动手实践
1.搭建EurekaServer
2.将user-service、order-service都注册到eureka
3.在order-service中完成服务拉取,然后通过负载均衡挑选一
个服务,实现远程调用
搭建EurekaServer
搭建EurekaServer服务步骤如下:
1.创建项目,引入spring-cloud-starter-netflix-eureka-server的依赖
2.编写启动类,添加@EnableEurekaServer注解
创建一个eureka-server的子模块,引入上面依赖,在主启动类上添加@EnableEurekaServer
3.添加application.yml文件,编写下面的配置:
在eureka-server的子模块的yml配置文件中,配置服务器名称以及地址
完成配置后,即可访问localhost:10086路由,访问Eureka的网页观察注册中心注册的服务实例
注册EurekaClient
将服务提供者user-service服务注册到EurekaServer步骤如下:
1.在user-service项目引入spring-cloud-starter-netflix-eureka-client的依赖
2.在application.yml文件,编写下面的配置:
name为该微服务在注册中心中的服务名,defaultZone为服务中心的路由
按照上述方法,将每个微服务都注册到注册中心上
另外,我们可以将user-service多次启动,模拟多实例部署,但为了避免端口冲突,需要修改端口设置
然后将这个服务也启动,就会发现注册中心中,名为userservice的服务有了两个实例,只是端口不一样。
完成服务拉取
在order-service完成服务拉取,服务拉取是基于服务名称获取服务列表,然后再对服务列表做负载均衡
1.修改OrderService的代码,修改访问的url路径,用服务名代替ip、端口:
2.在服务消费者order-service项目的启动类OrderApplication中的RestTemplate添加负载均衡注解
然后,调用两次服务消费者order-service项目所给的查询订单接口
可以看到,8081端口的userservice查询了一次用户查询,8082端口的查询一次