- Eureka注册中心
(1)之前的远程调用存在不足
- 硬编码问题
发起远程调用的时候如何知道IP和端口?
- 如果出现多个服务的提供者
9001/9003/9005,作为消费者如何选择?
- 服务消费者如何知道服务提供者的状态
9001/9003/9005,到底是哪一个可以正常使用,状态是健康的,到底哪一个宕机?
(2)Eureka的作用
如上的问题都可以使用SpringCloud的注册中心来解决,不得不提Eureka注册中心。
Eureka注册中心将服务注册和服务发现同一封封装到其客户端。
- 将所有微服务都交给注册中心管理。
- 再要进行远程调用的时候去注册中心中找可以使用的微服务。
- 如果找到的是多个通过负载均衡来处理和选择具体使用哪一个。
- 所有微服务的实例向定时的注册中心报告自己的健康状态。
发起远程调用的时候如何知道IP和端口?
- 服务注册:当微服务启动将自己的信息注册到注册中心。
- 注册中心的服务端保存服务名称到地址列表。
- 服务拉取【服务发现】:服务的消费者根据名称获取可以使用的列表。
如果出现多个服务的提供者,作为消费者如何选择?
- 可以利用负载均衡算法在列表选择一个具体的实例来使用。
- 利用选择的服务实例发起远程调用。
服务消费者如何知道服务提供者的状态?
- 定时的向注册中心报告自己的健康状态,称之为“心跳”。
- 如果过时不报告,注册中心认为这个实例NODK了,从列表中删除。
- 服务的消费者再拉取服务的时候,自然就不会找到没有及时报告健康状态的服务了。
(3)Eureka的基本操作
- 搭建注册中心
- 注册中心也是单独的微服务,正常的创建一个Maven的SpringBoot模块即可。
和以前一样。
- 修改pom文件,引入Eureka的服务端依赖。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.neusoft</groupId>
<artifactId>SpringCloud-Demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.neusoft.eureka</groupId>
<artifactId>Eureka-Server</artifactId>
<name>Eureka微服务</name>
<description>Eureka注册中心</description>
<!-- Eureka服务端依赖 -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
- 编写配置文件application.yml,端口号、名、客户端的配置。
# 端口号
server:
port: 10010
# 名称
spring:
application:
name: Eureka-Server
# 客户端配置
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10010/eureka
fetch-registry: false # 同步其他的Server的列表
- 准备一个启动类,注意开启Eureka注册中心的功能。
package com.neusoft.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* Eureka注册中心微服务的启动类
* 注意:添加注解@EnableEurekaServer,开启注册中心功能。
*
*/
@SpringBootApplication
@EnableEurekaServer // 开启注册中心功能
public class EurekaApp {
public static void main(String[] args) throws Exception {
SpringApplication.run(EurekaApp.class, args);
}
}
- 启动测试。
- 进行服务注册
- 修改用户微服务的pom文件,引入Eureka的客户端依赖。
<!-- eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 修改用户微服务的配置文件application.yml,添加名称、Eureka地址。
application:
name: userservice # 名字
# 客户端配置
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10010/eureka
- 启动多个实例测试。
ODK 没问题的,名称都是userservice,端口号是9001/9003/9005
注意:模拟多个实例的时候idea和eclipse操作不太一样。
- 进行服务发现
- 修改订单微服务的pom文件,引入Eureka的客户端依赖。
<!-- eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
- 修改订单微服务的配置文件application.yml,添加名称、Eureka地址。
application:
name: orderservice
# 客户端配置
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10010/eureka
- 拉取实例的时候进行后续的负载均衡,不用我们自己去做,只需要添加一个注解就可以。
// 注册一个RestTemplate
@Bean
@LoadBalanced // 实现负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
- 测试远程调用结果:
将原来的IP和端口替换成服务名。
String url = "http://userservice/user/" + order.getUid();
测试结果:
{"id":5,"uid":5,"name":"纪念卡","price":30,"num":3,"user":{"id":5,"uname":"刘能","address":"铁岭"}}
- 总结
会自动从注册中心中根据名称拉取可用的服务列表,通过负载均衡提供可以使用的具体的实例。
- Ribbon负载均衡
(1)能够记住注解:@LoadBalanced实现所谓负载均衡,使用的默认的策略。
(2)总结流程:
- 拦截服务消费者的请求http://userservice/user/5
- 获取名称
- 到注册中心拉取可用的服务列表
- 利用默认的负载均衡算出这一次要使用列表中的哪一个实例
- 最终发起真实的请求,将服务名称换回IP+端口号:http://localhost:9003/user/5。
(3)策略
- 内置
- 自定义
- 代码
- 配置文件
建议:负载均衡的策略默认即可,不推荐修改。
微服务中:Eureka注册中心,Eureka的作用,Eureka的基本操作,Ribbon负载均衡
最新推荐文章于 2024-01-26 22:38:27 发布