本章导学:
- 微服务各个服务如何调用?
- 服务直接调用出现的问题
- Eureka的引出及其作用
- 搭建单机Eureka
- 注册
- 发现
一、微服务各个服务之间的调用
很简单,我们只需要在SpringBoot的配置类里把RestTemplate类加载到容器,利用RestTemplate的getForObject方法调用即可
比如order服务调用user服务,需要在orderApplication加载restTeplate
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
接着再你需要调用别的服务的业务部分添加使用getForObject方法即可
这里提及一个概念:
服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
像上述案例,order就是消费者,消费了user服务。
二、 服务直接调用出现的问题
上述案例中,我们order调用user服务时的url是固定写死的硬编码
如果user服务的地址改变了,或者把user服务做成集群,显然硬编码是行不通的
但我们不采用硬编码,我们需要考虑几个问题
- 服务消费者该如何拿到服务提供者的地址信息呢?
- 如果有多个服务提供者,该选取哪一个消费呢?
- 服务消费者如何得知服务提供者的健康状态?
三、Eureka的作用
Eureka完美的解决了上述三个问题
Eureka把服务消费者和服务提供者统一为Eureka-Client(客户端) 注册中心称为Eureka-Server(服务端)
服务消费者该如何拿到服务提供者的地址信息呢?
它将服务提供者的信息全部注册到Eureka注册中心,当服务消费者需要消费时,只用向注册中心拉取所有的提供者信息即可
如果有多个服务提供者,该选取哪一个消费呢?
服务消费者拉取到提供者的信息后,通过负载均衡的轮循方案调用提供者
服务消费者如何得知服务提供者的健康状态?
服务提供者将每隔30秒持续的向注册中心发起一次心跳续约,当一个服务超过30秒后仍未做出心跳反应,注册中心就会剔除掉当前服务
总结一下Eureka的作用:
- 消费者该如何获取服务提供者具体信息?
- 服务提供者启动时向eureka注册自己的信息
- eureka保存这些信息
- 消费者根据服务名称向eureka拉取提供者信息
- 如果有多个服务提供者,消费者该如何选择?
- 服务消费者利用负载均衡算法,从服务列表中挑选一个
- 消费者如何感知服务提供者健康状态?
- 服务提供者会每隔30秒向EurekaServer发送心跳请求,报告健康状态 eureka会更新记录服务列表信息,
- 心跳不正常会被剔除
- 消费者就可以拉取到最新的信息
四、搭建单机Eureka-注册
- 引入Eureka依赖
- 编写启动类,添加@EnableEurekaServer注解
- 配置yaml文件
4.1、引入依赖
Eureka注册中心本身也是一个微服务,所以我们需要新创建一个项目
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
4.2、编写启动类,添加@EnableEurekaServer注解
新建一个启动类
package cn.brrbaii.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
4.3、配置yaml文件
server:
port: 10086
spring:
application:
name: eurekaServer #服务名称
eureka:
client:
service-url: #eureka地址信息
defauleZone: http://127.0.0.1:10086/eureka
配置完后启动一下主启动类即可
我们访问一下
接下来我们把order服务和user服务都注册到注册中心去
步骤后上面一样,只是依赖有所区别(client端)。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
另外,我们可以将user-service多次启动, 模拟多实例部署,但为了避免端口冲突,需要修改端口设置:-Dserver.port=(不冲突的端口)
查看注册好的服务
总结:
服务注册
- 引入eureka-client依赖
- 在application.yml中配置eureka地址
无论是消费者还是提供者,引入eureka-client依赖、知道eureka地址后,都可以完成服务注册
五、搭建单机Eureka-发现
服务拉取是基于服务名称获取服务列表,然后在对服务列表做负载均衡
- 修改OrderService的代码,修改访问的url路径,用服务名代替ip、端口:
- 在order-service项目的启动类OrderApplication中的RestTemplate添加负载均衡注解:
添加@loadBalance注解
调用4次user服务,查看是否启用了轮询模式的负载均衡
很明显,user的两个服务各调用了两次。实现了负载均衡
最后总结一下:
- 搭建EurekaServer
- 引入eureka-server依赖
- 添加@EnableEurekaServer注解
- 在application.yml中配置eureka地址
- 服务注册
- 引入eureka-client依赖
- 在application.yml中配置eureka地址
- 服务发现
- 引入eureka-client依赖
- 在application.yml中配置eureka地址
- 用服务提供者的服务名称远程调用
- 给RestTemplate添加@LoadBalanced注解 用服务提供者的服务名称远程调用