Eureka组件
Eureka是Netfilx开源的服务发现组件,本身是一个基于rest的服务,它包含client和server两部分。
Spirng Cloud将它集成在子项目Spirng Cloud Netfilx中,从而实现服务的注册和发现
1.eureka中的server和client的介绍及特点
Eureka Server:提供服务发现的能力,各个微服务启动时,会向Eureka Server注册自己的信息例如(IP,端口
号,服务名称等),Eureka会存储这些信息
Eureka Client:是一个java的客户端用来简化Eureka Server的交互
微服务启动后会周期性的(默认30秒)向Eureka Server发送心跳,如果Eureka在规定的时间没有收到心跳,
则会注销该实例(默认90秒)
Eureka Client会缓存服务注册表中的信息。这种方式有一定的优势首先可以降低Eureka Server的压力,其次
当所有的Eureka Server宕机服务调用方依然可以完成调用
2.服务注册与服务发现
服务注册:当微服务client启动时,向Eureka Server发起注册,并上报该节点的相关信息
服务发现:client从Eureka Server获取注册信息,然后发起调用
3.Eureka Server开发
1.引入springcloud的相关依赖
主项目引入
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Eureka Server pom
<!--eureka server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2.入口类的开发
//@EnableDiscoveryClient //不仅支持Eureka作为注册中心还支持zookeeper
@EnableEurekaServer //只支持Eureka
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
3.配置文件
# 应用名称
spring.application.name=eureka-server
#端口号
server.port=8761
#开启IP优先
eureka.instance.prefer-ip-address=true
#设置eureka server 的交互地址,之后的服务获取和服务注册都需要依赖于这个地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
#表示是否将自己注册到eureka上
eureka.client.register-with-eureka=false
#表示是否从eureka server上获取注册信息
eureka.client.fetch-registry=false
4.Eureka Client 服务消费者
1.pom
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.入口类
@EnableEurekaClient
@SpringBootApplication
public class EurekaConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerApplication.class, args);
}
}
3.配置文件
# 应用名称
spring.application.name=eureka-consumer
# 应用服务 WEB 访问端口
server.port=8762
#开启IP优先
eureka.instance.prefer-ip-address=true
#开启注册
eureka.client.register-with-eureka=true
#开启抓取
eureka.client.fetch-registry=true
#注册地址
#注册中心的地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
5.Eureka Client 提供者
eureka-producter-client1
1.pom
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.入口类
@SpringBootApplication
@EnableEurekaClient
public class EurekaProducterClient1Application {
public static void main(String[] args) {
SpringApplication.run(EurekaProducterClient1Application.class, args);
}
}
3.配置文件
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
spring.application.name=eureka-producter
server.port=8763
创建服务提供者2eureka-producter-client2 port改为8764
6.Eureka的健康监测
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
management.endpoint.health.show-details=always
访问 http://localhost:8762/actuator/health
7.openfeign远程调用
1.pom
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--netflix-hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.入口类
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
@SpringBootApplication
public class EurekaConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerApplication.class, args);
}
}
3.配置文件
#日志
logging.level.com.example.eurekaconsumer.feign.TestFeign=debug
#为feign开启断路器
feign.hystrix.enabled=true
4.openfeign服务类
@Component
@FeignClient(value = "EUREKA-PRODUCTER",fallback = FeignClientFallBack.class)
public interface TestFeign {
@RequestMapping("/feign/test")
String testFeign(@RequestParam("name") String name);
}
5.服务降级
@Component
public class FeignClientFallBack implements TestFeign{
@Override
public String testFeign(String name) {
return "Fallback相当于是降级操作 服务降级处理是在客户端实现完成的!"+name;
}
}
6.服务提供类接口
eureka-producter-client1
@RestController
@RequestMapping("feign")
public class FeignController {
@RequestMapping("test")
public String test(String name){
System.out.println("===================");
return "hello client 8763:"+name;
}
}
eureka-producter-client2
@RestController
@RequestMapping("feign")
public class FeignController {
@RequestMapping("test")
public String test(String name){
return "hello client 8764:"+name;
}
}
7Ribbon负载均衡
Ribbon 的负载均衡策略
RoundRobinRule 轮训策略 按顺序循环选择 Server
RandomRule 随机策略 随机选择 Server
AvailabilityFilteringRule 可用过滤策略 会先过滤由于多次访问故障而处于断路器跳闸状态的服
务,还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问
WeightedResponseTimeRule 响应时间加权策略 根据平均响应的时间计算所有服务的权重,响应时间越
快服务权重越大被选中的概率越高,刚启动时如果统计信息不足,则使用RoundRobinRule策略,等统计信息
足够会切换到
RetryRule 重试策略 先按照RoundRobinRule的策略获取服务,如果获取失败则在
制定时间内进行重试,获取可用的服务。
BestAviableRule 最低并发策略 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服
务,然后选择一个并发量最小的服务
默认为轮询策略
1.配置文件
EUREKA-PRODUCTER.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
3.测试
http://localhost:8762/feign/test?name=666