SpringCloud之Eueka注册中心
Eureka的主要功能是进行服务管理,定期检查服务状态,返回服务地址列表。
Eureka架构中的三个核心角色:服务注册中心,服务提供者,服务消费者
如图所示:
一丶搭建eureka_server工程
Eureka是服务注册中心,只做服务注册;自身并不提供服务也不消费服务。可以搭建web工程使用Eureka,可以使用Spring Boot方式搭建。
-
创建工程;
-
添加启动器依赖;
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
-
编写启动引导类(添加Eureka的服务注解)和配置文件;
-
修改配置文件(端口,应用名称…);
server: port: 10086 spring: application: name: eureka-server eureka: client: service-url: # eureka 服务地址,如果是集群的话;需要指定其它集群eureka地址 defaultZone: http://127.0.0.1:10086/eureka # 不注册自己 register-with-eureka: false # 不拉取服务 fetch-registry: false server: # 服务失效剔除时间间隔,默认60秒 eviction-interval-timer-in-ms: 60000 # 关闭自我保护模式(默认是打开的) enable-self-preservation: false
-
启动测试
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; //声明当前应用时Eureka服务 @EnableEurekaServer @SpringBootApplication //@EnableDiscoveryClient //开启Eureka客户端发现功能 public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
二丶服务注册与发现
将user-service的服务注册到eureka并在consumer-demo中可以根据服务名称调用
-
服务注册:在服务提供工程user-service上添加Eureka客户端依赖;自动将服务注册到EurekaServer服务地址列表。
-
添加依赖;
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
改造启动引导类;添加开启Eureka客户端发现的注解;
@SpringBootApplication @MapperScan("com.itheima.user.mapper") @EnableDiscoveryClient //开启Eureka客户端发现功能 public class UserApplication { public static void main(String[] args) { SpringApplication.run(UserApplication.class, args); } }
-
修改配置文件;设置Eureka 服务地址
server: port: ${port:9091}#如果port有值就用该值,没有的话就用9091 spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/springcloud username: root password: root application: name: user-service mybatis: type-aliases-package: com.itheima.user.pojo eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka instance: # 更倾向使用ip地址,而不是host名 prefer-ip-address: true # ip地址 ip-address: 127.0.0.1 # 续约间隔,默认30秒 lease-renewal-interval-in-seconds: 5 # 服务失效时间,默认90秒 lease-expiration-duration-in-seconds: 5
-
-
服务发现:在服务消费工程consumer-demo上添加Eureka客户端依赖;可以使用工具类根据服务名称获取对应的服务地址列表。
-
添加依赖;
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
-
改造启动引导类;添加开启Eureka客户端发现的注解;
/*@SpringBootApplication @EnableDiscoveryClient //开启Eureka客户端发现功能 @EnableCircuitBreaker //开启熔断*/ @SpringCloudApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
-
修改配置文件;设置Eureka 服务地址;
spring: application: name: consumer-demo eureka: client: service-url: defaultZone: http://127.0.0.1:10086/eureka # 获取服务地址列表间隔时间,默认30秒 registry-fetch-interval-seconds: 10 hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 2000 circuitBreaker: errorThresholdPercentage: 50 # 触发熔断错误比例阈值,默认值50% sleepWindowInMilliseconds: 10000 # 熔断后休眠时长,默认值5秒 requestVolumeThreshold: 10 # 熔断触发最小请求次数,默认值是20
-
改造处理器类ConsumerController,可以使用工具类DiscoveryClient根据服务名称获取对应服务地址列表。
@RestController @RequestMapping("/consumer") @Slf4j @DefaultProperties(defaultFallback = "defaultFallback") public class ConsumerController { @Autowired private RestTemplate restTemplate; @Autowired private DiscoveryClient discoveryClient; @GetMapping("/{id}") //@HystrixCommand(fallbackMethod = "queryByIdFallback") @HystrixCommand public String queryById(@PathVariable Long id){ if (id == 1) { throw new RuntimeException("太忙了"); } /*String url = "http://localhost:9091/user/"+id; //获取eureka中注册的user-service的实例 List<ServiceInstance> serviceInstances = discoveryClient.getInstances("user-service"); ServiceInstance serviceInstance = serviceInstances.get(0); url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/user/" + id;*/ String url = "http://user-service/user/" + id; return restTemplate.getForObject(url, String.class); }
-
三丶Eureka的高可用配置
可以启动两台eureka-server实例;在eureka管理界面看到两个实例,Eureka Server是一个web应用,可以启动多个实例(配置不同端口)保证Eureka Server的高可用。
将Eureka Server作为一个服务注册到其它Eureka Server,这样多个Eureka Server之间就能够互相发现对方,同步服务,实现Eureka Server集群。
四丶Eureka客户端与服务端的配置
配置eureka客户端user-service的注册、续约等配置项,配置eureka客户端consumer-demo的获取服务间隔时间;了解失效剔除和自我保护
- Eureka客户端工程
- user-service 服务提供
- 服务地址使用ip方式
- 续约
- consumer-demo 服务消费
- 获取服务地址的频率
- user-service 服务提供
- Eureka服务端工程 eureka-server
- 失效剔除
- 自我保护
- user-service
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
instance:
# 更倾向使用ip地址,而不是host名
prefer-ip-address: true
# ip地址
ip-address: 127.0.0.1
# 续约间隔,默认30秒
lease-renewal-interval-in-seconds: 5
# 服务失效时间,默认90秒
lease-expiration-duration-in-seconds: 5
- consumer-demo
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
# 获取服务地址列表间隔时间,默认30秒
registry-fetch-interval-seconds: 10
- eureka-server
eureka:
server:
# 服务失效剔除时间间隔,默认60秒
eviction-interval-timer-in-ms: 60000
# 关闭自我保护模式(默认是打开的)
enable-self-preservation: false