在传统的RPC远程调用中,管理每个服务于服务之间依赖关系复杂,管理复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册。
Eureka是Netflix开源的一款基于REST(Representational State Transfer)的服务发现框架,它主要用于微服务架构中的服务治理,能够实现自动化的服务注册与发现,是springcloud体系中的一个核心组件。Eureka服务器搭建完成后,可以将微服务注册到Eureka服务器上,客户端可以通过Eureka服务器来获取服务的地址和端口号,从而实现服务的调用。
用来实现各个微服务实例化的自动化注册与发现。
首先会构建一个服务中心,之后的每个服务单元向这个服务中心提供主机,端口号等信息登记自己提供的服务。
注册中心通过服务名分类组织服务清单,并对其进行维护。
服务注册中心需要以心跳的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除。
服务之间不需要指定具体的实例地址,而是通过服务中心发起请求调用实现。所以,调用方并不需要知道服务提供方具体的位置,只需向注册中心发起请求,从而获取所有服务的实例清单,才能实现对具体服务实例的访问。
实际应用中,不会每次都向注册中心获取服务,使用了缓存和服务剔除等不同的策略。
创建一个maven工程,然后引入Eureka依赖,配置Eureka的各项配置,启动类添加注解
org.springframework.cloud
spring-cloud-starter-netflix-eureka-server
1.4.6.RELEASE
eureka:
instance:
hostname: eureka1 #hostname用于eureka集群服务器之间的区分
lease-expiration-duration-in-seconds: 90 #最后一次心跳后,间隔多久认定微服务不可用,默认90
client:
register-with-eureka: false #不向自身注册。由于该应用为单个注册中心,所以设置为false,代表不向注册中心注册自己。
fetch-registry: false #不从自身拉取注册信息。由于单个注册中心,不拉取自身信息。
serviceUrl.defaultZone: http://localhost:2001/eureka/
server:
enable-self-preservation: false #eureka的自我保护状态。测试时将其关闭
package src;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
//通过注解触发自动配置
@EnableEurekaServer
@SpringBootApplication
public class SpringCloudEurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudEurekaServerApplication.class,args);
}
}
有了Eureka服务注册与发现中心后,就可以将服务的客户端和服务的提供者都注册到Eureka
服务注册也分三步1、添加依赖 2、加配置3、加注解
引依赖时需要注意springcloud版本与springboot版本需要对应,按照对应表进行配置,否则会报错
org.springframework.boot
spring-boot-starter-parent
2.6.3
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-dependencies
2021.0.3
pom
import
package com.user.service;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient
@SpringBootApplication
public class UserviceApplication {
public static void main(String[] args) {
SpringApplication.run(UserviceApplication.class, args);
}
}
eureka:
instance:
lease-expiration-duration-in-seconds: 30 #心跳间隔时间,默认为30s
client:
registry-fetch-interval-seconds: 30 #拉取注册信息间隔时间,默认30s
service-url:
defaultZone: http://127.0.0.1:2001/eureka #表示eureka服务注册中心的部署位置
服务提供者有一个接口,服务调用者需要进行调用
package com.user.service.controller;
import com.user.service.entity.User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author lijianxi
* @date 2023年06月02日 3:43 下午
*/
@RestController
public class UserController {
@GetMapping("/getUser")
public User getUser(){
User u = new User();
u.setId(1);
u.setName("张三");
System.out.println("2被调用");
return u;
}
}
如果没有Eureka,那么调用时候通过http请求进行调用,需要调用方维护提供者的ip地址和端口等信息,如果服务提供方不止一个,那么调用方还需要进行维护,加逻辑判断调用的是哪个
有了Eureka后,服务调用方不再维护服务提供者的ip和端口
只需要知道服务名称即可,
springcloud-eureka-user就是服务调用方的服务名称
服务提供方的配置同服务调用方
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.6.3
com.user
user
0.0.1-SNAPSHOT
Uservice
Demo project for Spring Boot
8
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
runtime
true
org.springframework.boot
spring-boot-configuration-processor
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.springframework.cloud
spring-cloud-dependencies
2021.0.3
pom
import
org.springframework.boot
spring-boot-maven-plugin
org.projectlombok
lombok
package com.user.service;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient
@SpringBootApplication
public class UserviceApplication {
public static void main(String[] args) {
SpringApplication.run(UserviceApplication.class, args);
}
}
spring:
application:
name: springcloud-eureka-user
server:
port: 8002
eureka:
instance:
lease-expiration-duration-in-seconds: 30 #心跳间隔时间,默认为30s
client:
registry-fetch-interval-seconds: 30 #拉取注册信息间隔时间,默认30s
service-url:
defaultZone: http://127.0.0.1:2001/eureka #表示eureka服务注册中心的部署位置
# info配置
info:
# 项目的名称
app.name: 项目名-springcloud
# 公司的名称
company.name: 自定义配置
多个服务提供者只要name保持一致,就能够通过Eureka实现负载均衡,默认是轮询策略