Eureka入门学习–含实现案例
1、什么是eureka
参考博客:参考参考,看看别人的博客
1)参考一
2)参考二
3)参考三
2、SpringBoot + Eureka+Feign:Eureka注册中心搭建、服务注册发现、服务间调用
一个Server:注册中心、两个Client Demo: Client2 调用 Client1
2.1服务注册中心的搭建
创建springboot项目,导入相应依赖 pom.xml
<!--web或其他的依赖省略-->
<!--eureka 服务端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--eureka 客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.yml配置文件
server:
port: 8888
eureka:
instance:
hostname: localhost #服务注册中心实例的主机名
server:
wait-time-in-ms-when-sync-empty: 0
enable-self-preservation: false
client:
register-with-eureka: false #是否向服务注册中心注册自己
fetch-registry: false #是否检索服务
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#http://localhost:8888/eureka/ #服务注册中心的配置内容,指定服务注册中心的位置
spring:
application:
name: eureka-server
启动类 EurekaServerApplication
@SpringBootApplication
@EnableEurekaServer //核心注解,表示启动EurekaServer,必须要加上该注解
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
启动该项目:
2.2 eureka-client-1搭建
创建springboot项目,导入相应依赖 pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--eureka 客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.yml配置文件
spring:
application:
name: eureka-client-1
#eureka注册中心的地址
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka/
server:
port: 8001
启动类 EurekaClient1Application
@SpringBootApplication
@EnableEurekaClient # eureka client开启注解
public class EurekaClient1Application {
public static void main(String[] args) {
SpringApplication.run(EurekaClient1Application.class, args);
}
}
创建一个RestAPI,供client2调用
@RestController
@RequestMapping("/test")
public class TestApiController {
@GetMapping("/get/{msg}")
public String getTestFeign(@PathVariable("msg") String msg){
return "client1:TestController:getTestFeign方法接收到参数:"+msg;
}
}
启动client1服务,发现client1服务已被注册到注册中心
2.3 eureka-client-2搭建
创建springboot项目,导入相应依赖 pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--eureka 客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--因为 client2 需要 feign 远程调用 client1,所以导入此依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
application.yml配置文件
server:
port: 8002
spring:
application:
name: eureka-client-2
# eureka注册中心的地址
eureka:
client:
service-url:
defaultZone: http://localhost:8888/eureka/
启动类 EurekaClient2Application
@SpringBootApplication
@EnableEurekaClient # eureka client开启注解
@EnableFeignClients # feign 调用开启注解
public class EurekaClient2Application {
public static void main(String[] args) {
SpringApplication.run(EurekaClient2Application.class, args);
}
}
创建以下目录结构:
EurekaFeignClient
@Component
@FeignClient(value = "eureka-client-1") //@FeignClient注解的 value属性值:注册中心中 client1 的名字:eureka-client-1
public interface EurekaFeignClient {
//该方法的返回参数、@GetMapping中的路由、方法中的参数 需要与 eureka-client-1 被调用接口的一致
//该方法类似于 eureka-client-1 --> @RequestMapping("/test") public class TestApiController --> @GetMapping("/get/{msg}") public String getTestFeign(@PathVariable("msg") String msg) 的一个代理
@GetMapping("/test/get/{msg}")
public String getFeignFeignClient(@PathVariable("msg")String msg);
}
FeignTestController
//就是一个用于测试的普通Controller
@RestController
@RequestMapping("/feign_test")
public class FeignTestController {
//依赖注入了 EurekaFeignClient
@Autowired
private EurekaFeignClient eurekaFeignClient;
@GetMapping("/call/{msg}")
public String testFeignCall(@PathVariable("msg") String msg){
//调用了EurekaFeignClient 的getFeignFeignClient方法
String feignFeignClient = eurekaFeignClient.getFeignFeignClient(msg);
return feignFeignClient;
}
}
启动client2服务,发现client2服务已被注册到注册中心
调用测试client2中的 FeignTestController#testFeignCall方法
3、总结与疑问
总结:已完成了eureka的基本使用、实现了同一eureka注册中心下,各个服务直接的Feign调用
疑问1:eureka中心挂了,那么所有服务都用不了了,相互之间的调用也完了,所以搭建eureka集群,保证注册中心高可用很重要,怎么弄呢? //后续解决了再更新微博
疑问2:各个client注册服务直接 使用 @FeignClient 就能如此轻松的调用,那么底层实现原理是怎么实现的呢? //后续研究明白了,再写文章