基本概念:
eureka是spring自带的服务注册和发现。每个服务都必须在注册中心注册才能被其他服务发现。
在eureka中,存在三个角色:一个是注册中心,一个是请求服务,另一个是被请求服务;其中,注册中心需要作为一个单独的服务启动;
服务注册与发现的流程:
为什么需要eureka?
在微服务模式下,我们将一个单体应用切分成多个独立的服务单元,而每一个服务单元又被部署在不同的机器或端口上。但要完成一个完整的业务请求,需要调用多个微服务的能力来实现,怎么在这样的模式下找到我们需要调用的微服务在哪个机器的哪个端口上就成了eureka解决的问题。你可能会说,配置IP+端口地址不就好了吗?但是当服务器宕机时,服务被迁移到其他机器了,难道要重新配置IP和端口吗?如果某个服务的流量很大,需要进行紧急扩容,这个时候又该怎么确定应该访问哪台机器上的服务呢?没错,eureka还可以自动实现负载均衡,当你的服务需要访问其他微服务的时候,你只要拿着服务的名称到eureka查找,eureka就能够给你一个合适的服务地址,接下来只需要安心地去调用就行了。
实践:
一、创建一个新的Spring boot项目,添加以下依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>2021.0.3</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
二、创建启动类
@SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
三、在application.yml中配置属性
server: port: 8761 #注册中心启动端口 eureka: client: registerWithEureka: false # 不注册自己 fetchRegistry: false
启动项目后,打开浏览器访问 http://localhost:8761
,就可以看到 Eureka 面板
四、客户端注册到eureka
要让自己的服务能够被发现,那么就需要在项目中添加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--这里需要多引入一个spring-web依赖,因为当项目启动的时候,需要有一个守护线程去维持他。不然就会出现项目没报错却自动退出的情况。引入starter-web后,就会有一个tomcat线程持续运行--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>3.3.1</version> </dependency>
在启动类上添加@EnableDiscoveryClient:
@SpringBootApplication @EnableDiscoveryClient public class StartMain { public static void main(String[] args) { SpringApplication.run(StartMain.class, args); } }
在配置文件中添加注册中心地址:
spring: application: name: spring-study server: port: 0 #任意端口启动 eureka: client: serviceUrl: defaultZone: ${EUREKA_URI:http://localhost:8080/eureka} #注册到eureka instance: preferIpAddress: true appname: test-register
启动项目,就能看到TEST-REGISTER服务被注册到eureka
五、消费者发现服务
新建一个spring项目,在pom文件中添加依赖:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>3.3.1</version> </dependency> <!--用于服务发现--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
配置文件不注册到eureka:
spring: application: name: customer server: port: 0 eureka: client: serviceUrl: register-with-eureka: false defaultZone: ${EUREKA_URI:http://localhost:8080/eureka}
启动类上添加:
@SpringBootApplication @EnableFeignClients public class CustomerApplication { public static void main(String[] args) { SpringApplication.run(CustomerApplication.class, args); } }
创建feign接口:
@FeignClient(name = "spring-study") //name为注册到eureka的服务名称 public interface TestRegisterFeign { @GetMapping("/test/hello")//spring-study服务提供的接口 String getHello(); }
创建测试接口:
@RequestMapping("/test") @RestController public class Test { @Autowired TestRegisterFeign testRegisterFeign; @GetMapping("/hello") public String test() { return testRegisterFeign.getHello(); } }
浏览器中访问接口看到Hello world,成功发现服务: