文章目录
1.Eureka的结构与作用
-
在Eureka架构中,微服务角色有两类:
- lEurekaServer:服务端,注册中心
-
记录服务信息
-
u心跳监控
- lEurekaClient:客户端
-
Provider:服务提供者
-
注册自己的信息到EurekaServer
-
每隔30秒向EurekaServer发送心跳
-
-
consumer:服务消费者
- 根据服务名称从EurekaServer拉取服务列表
- 基于服务列表做负载均衡,选中一个微服务后发起远程调用
-
Eureka Server: Eureka 服务注册中心,主要用于提供服务注册功能。当微服务启动时,会将自己的服务注册到 Eureka Server。Eureka Server 维护了一个可用服务列表,存储了所有注册到 Eureka Server 的可用服务的信息,这些可用服务可以在 Eureka Server 的管理界面中直观看到。
-
Eureka Client: Eureka 客户端,通常指的是微服务系统中各个微服务,主要用于和 Eureka Server 进行交互。在微服务应用启动后,Eureka Client 会向 Eureka Server 发送心跳(默认周期为 30 秒)。若 Eureka Server 在多个心跳周期内没有接收到某个 Eureka Client 的心跳,Eureka Server 将它从可用服务列表中移除(默认 90 秒)。
2.搭建eureka-server服务
-
创建eureka-server服务模块
-
引入SpringCloud为eureka提供的starter依赖
pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- 编写启动类,添加@EnableEurekaServer注解
java
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class,args);
}
}
- 在application.yml文件,编写配置
yml
server:
port: 10086 #eureka服务端口
spring:
application:
name: eureka-server #eureka服务名称
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka #eureka服务地址
3.注册service服务
- 在user-service的pom文件中,引入eureka-client依赖
pom
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 在user-service的application.yml文件中,添加服务名称、eureka地址
yml
spring:
application:
name: userservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
-
复制原来的user-service启动配置,模拟多实例部署,启动多个user-service实例
-
修改名称,配置端口,避免冲突
4.服务发现
- 在order-service的pom文件中,引入eureka-client依赖
pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 在order-service的application.yml文件,添加服务名称、eureka地址
yml
spring:
application:
name: order-service # order eureka服务名称
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka #eureka服务地址
- 服务拉取和负载均衡,在order-service的OrderApplication中,给RestTemplate这个Bean添加一个@LoadBalanced注解:
java
/**
* 创建 RestTemplate 并注入 Spring 容器
* @return
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
- 修改OrderService类中的queryOrderById方法。修改访问的url路径,用服务名代替ip、端口
- String url ="http://user-service/user/"+order.getUserId();
- spring会自动帮助我们从eureka-server端,根据userservice这个服务名称,获取实例列表,而后完成负载均衡。
java
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//2.利用 RestTemplate 发起 http 请求,查询用户
//2.1 url路径
//String url ="http://localhost:8081/user/"+order.getUserId();
String url ="http://user-service/user/"+order.getUserId();
//2.2 发起 http 请求,实现远程调用
User user= restTemplate.getForObject(url, User.class);
//3. 封装 user 到 Order
order.setUser(user);
// 4.返回
return order;
}