前言 Eureka is a REST (Representational State Transfer) based service that is primarily used in the AWS cloud for locating services for the purpose of load balancing and failover of middle-tier servers.(Github )
Eureka中微服务的角色分类
EurekaServer服务端
EurekaClient客户端
Provider生产者
注册自己的信息到EurekaServer服务端
每隔30秒向EurekaServer发送心跳
Consumer消费者
根据服务名称从EurekaServer拉去服务列表
基于服务列表做负载均衡,选中一个微服务后发起远程调用
父级依赖
pom.xml 1 2 3 4 5 6 7 8 9 10 11 <dependencyManagement > <dependencies > <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-dependencies</artifactId > <version > Hoxton.SR10</version > <type > pom</type > <scope > import</scope > </dependency > </dependencies > </dependencyManagement >
单台注册中心
EurekaServer服务端 引入依赖 pom.xml 1 2 3 4 <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-starter-netflix-eureka-server</artifactId > </dependency >
启动类注册
在启动类添加@EnableEurekaServer
注解启动Eureka
1 2 3 4 5 6 7 @EnableEurekaServer @SpringBootApplication public class Application { public static void main (String[] args) { SpringApplication.run(Application.class, args); } }
修改配置
server.port
:端口号,默认为8761spring.application.name
:服务名称。服务名称不是域名,不能被直接访问eureka.client.service-url.defaultZone
::注册服务到注册中心,单台中指向自己eureka.server.instance.hostname
:主机名,集群中区分不同服务器的域名eureka.server.enable-self-preservation
:是否开启保护模式,默认为true,开发期间禁用保护模式eureka.client.register-with-eureka=false
:单台服务器不向自身注册eureka.client.fetch-registry=false
:单台服务器不从自身拉取注册信息eureka.instance.lease-expiration-duration-in-seconds
:最后一次心跳后,间隔多久认定微服务不可用,默认90
src/main/resources/application.yml 1 2 3 4 5 6 7 8 9 spring: application: name: eureka-server server: port: 8000 eureka: client: service-url: defaultZone: http://127.0.0.1:8000/eureka
eureka 的自我保护状态:心跳失败的比例,在15分钟内是否超过85%,如果出现了超过的情况,Eureka Server会将当前的实例注册信息保护起来,同时提示一个警告,一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据。也就是不会注销任何微服务
启动服务端
<server>
:服务端jar包
1 java -jar <server>.jar --server.port=8001 --eureka.client.service-url.defaultZone=8001
EurekaClient客户端 引入依赖 pom.xml 1 2 3 4 <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-starter-netflix-eureka-client</artifactId > </dependency >
修改配置 src/main/resources/application.yml 1 2 3 4 5 6 7 8 9 spring: application: name: eureka-serveice server: port: 8080 eureka: client: service-url: defaultZone: http://127.0.0.1:8000/eureka
启动客户端
<client>
:客户端jar包
1 2 java -jar <client>.jar --spring.application.name=user-serveice --server.port=8081 --eureka.client.service-url.defaultZone=http://127.0.0.1:8001/eureka java -jar <client>.jar --spring.application.name=order-serveice --server.port=8082 --eureka.client.service-url.defaultZone=http://127.0.0.1:8001/eureka
多台注册中心集群
EurekaServer服务端 引入依赖 pom.xml 1 2 3 4 <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-starter-netflix-eureka-server</artifactId > </dependency >
启动类注册
在启动类添加@EnableEurekaServer
注解启动Eureka
1 2 3 4 5 6 7 @EnableEurekaServer @SpringBootApplication public class Application { public static void main (String[] args) { SpringApplication.run(Application.class, args); } }
修改配置
eureka.client.service-url.defaultZone
::注册服务到注册中心,集群中指向其他注册中心
src/main/resources/application.yml 1 2 3 4 5 6 7 8 9 spring: application: name: eureka-server server: port: 8000 eureka: client: service-url: defaultZone: http://127.0.0.1:8000/eureka
启动服务端
<server>
:服务端jar包
1 2 java -jar <server>.jar --server.port=8001 --eureka.instance.hostname=eureka1 --eureka.client.service-url.defaultZone=http://127.0.0.1:8002/eureka java -jar <server>.jar --server.port=8002 --eureka.instance.hostname=eureka2 --eureka.client.service-url.defaultZone=http://127.0.0.1:8001/eureka
EurekaClient客户端 引入依赖 pom.xml 1 2 3 4 <dependency > <groupId > org.springframework.cloud</groupId > <artifactId > spring-cloud-starter-netflix-eureka-client</artifactId > </dependency >
修改配置
src/main/resources/application.yml 1 2 3 4 5 6 7 8 9 spring: application: name: eureka-service-user server: port: 8080 eureka: client: service-url: defaultZone: http://127.0.0.1:8000/eureka,http://127.0.0.1:8000/eureka
启动客户端
<client>
:客户端jar包
1 2 java -jar <client>.jar --server.port=8081 --eureka.client.service-url.defaultZone=http://127.0.0.1:8001/eureka,http://127.0.0.1:8002/eureka java -jar <client>.jar --server.port=8082 --eureka.client.service-url.defaultZone=http://127.0.0.1:8001/eureka,http://127.0.0.1:8002/eureka
消费者访问生产者 添加RestTemplate的Bean
在Bean上添加@LoadBalanced
注解实现向生产者发送请求时的负载均衡
被@LoadBalanced
注解标注的RestTemplate,发出的请求会被Ribbon拦截,Ribbon会先向Eureka根据服务名拉取请求的真实地址,再进行负载均衡
src/main/java/com/conf/RestTemplateConfig.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package com.conf;import org.springframework.boot.SpringBootConfiguration;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;@SpringBootConfiguration public class RestTemplateConfig { @LoadBalanced @Bean public RestTemplate restTemplate () { return new RestTemplate (); } }
消费者通过服务名访问生产者 1 2 3 4 5 6 7 @Autowired RestTemplate restTemplate public void method () { String url = "http://eureka-service-user/users/" + order.getUserId(); User user = restTemplate.getForObject(url, User.class); }
修改负载均衡的方式 通过配置类修改
轮询方式 src/main/java/com/conf/RestTemplateConfig.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package com.conf;import org.springframework.boot.SpringBootConfiguration;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;@SpringBootConfiguration public class RestTemplateConfig { @LoadBalanced @Bean public RestTemplate restTemplate () { return new RestTemplate (); } @Bean public IRule iRule () { return new ZoneAvoidanceRule (); } }
随机方式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package com.conf;import com.netflix.loadbalancer.IRule;import com.netflix.loadbalancer.RandomRule;import org.springframework.boot.SpringBootConfiguration;import org.springframework.cloud.client.loadbalancer.LoadBalanced;import org.springframework.context.annotation.Bean;import org.springframework.web.client.RestTemplate;@SpringBootConfiguration public class RestTemplateConfig { @LoadBalanced @Bean public RestTemplate restTemplate () { return new RestTemplate (); } @Bean public IRule iRule () { return new RandomRule (); } }
通过配置文件修改
轮询方式 src/main/resources/application.yml 1 2 3 服务名: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule
随机方式 src/main/resources/application.yml 1 2 3 服务名: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
饥饿加载配置
Ribbon默认使用懒加载方式,只有第一次访问服务时,才会去Eureka注册中心拉取服务地址
与懒加载相对应的是饥饿加载,当开启了饥饿加载,当启动服务器时就会在Eureka注册中心拉取服务地址
ribbon.eager-load.enable
:指定是否开启饥饿加载ribbon.eager-load.clients
:指定需要饥饿加载的服务名。如果是多个服务,需要指定Yaml集合。如果不指定,则所有服务都被饥饿加载
src/main/resources/application.yml 1 2 3 ribbon: eager-load: enable: true
完成
参考文献 哔哩哔哩——黑马程序员