Eureka包含了服务器端和客户端的组件,服务端被称作服务注册中心,用于提供服务的祖册与发现。
客户端包含服务的消费者与服务生产者。
在应用程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性的发送心跳来更新它的服务租约。同时也可以从服务端查询当前注册的服务信息并把他们缓存到本地并周期性的刷新服务状态。
总结:功能:服务注册与发现,各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
功能:
服务请求调用客户端负载均衡,服务间发起请求的时候,基于Rebbon做负载均衡,从一台服务的多台机器中挑选一台。
功能:
熔断器,起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
Springcloud中文编译官网
https://blog.csdn.net/u010889990/article/details/78673273
注意:
要使用这个首先要在启动类中加入@EnableFeignClients这个注解【标识开启应用】
在接口里面需要添加@FeignClient注解
一般定义Consumer/login【标识这个是消费者】
参考:https://blog.csdn.net/kangkanglou/article/details/76407623
https://blog.csdn.net/zwx19921215/article/details/79804379
http://blog.didispace.com/spring-cloud-starter-dalston-2-3/
feign是netflix提供的服务间基于http的rpc调用,在spingcloud中广泛应用。
一个feign client是在hystrix【断路由器】中执行,并利用ribbon进行负载选择服务,hystrix控制整个请求从调用到方法返回,而ribbon控制从选址到socket返回;
功能:api路由网关,如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务
他有三端构成
1.Eureka Server 服务注册与发现中心端
2.Service Provider服务提供者端
3.Service Consumer服务调用者端
Pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
启动类
@SpringBootApplication
//创建服务注册中心
@EnableEurekaServer
public class StartMain {
public static void main(String[] args) {
SpringApplication.run(StartMain.class, args);
}
}
Yml
## server
server.port=8081
##eureka
#指定环境
eureka.environment=work
# 设置是否将自己作为客户端注册到注册中心(缺省true)
# 这里为不需要(查看@EnableEurekaServer注解的源码,会发现它间接用到了@EnableDiscoveryClient)
eureka.client.register-with-eureka=false
# 设置是否从注册中心获取注册信息(缺省true)
# 因为这是一个单点的EurekaServer,不需要同步其它EurekaServer节点的数据,故设为false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
#是否开启自我保护模式,默认为true。
eureka.server.enable-self-preservation=true
#续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
eureka.server.eviction-interval-timer-in-ms=10000
Pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
微服务client启动类
@SpringBootApplication
@EnableEurekaClient
public class StartMain {
public static void main(String[] args) {
SpringApplication.run(StartMain.class, args);
}
}
微服务client,配置文件
##eureka
eureka.client.serviceUrl.defaultZone=http://localhost:8081/eureka/
eureka.instance.instance-id=${spring.application.name}:${server.port}
# 设置微服务调用地址为IP优先(缺省为false)
eureka.instance.prefer-ip-address=true
# 心跳时间,即服务续约间隔时间(缺省为30s)
eureka.instance.lease-renewal-interval-in-seconds=30
# 发呆时间,即服务续约到期时间(缺省为90s)
eureka.instance.lease-expiration-duration-in-seconds=90
服务端
server:
# 项目端口号
port: 8761
# SSL 配置
ssl:
# 开启 SSL 认证
enabled: true
# 证书别名
key-alias: eurekaserver
# 证书存放路径
key-store: classpath:EurekaServer.p12
# 证书密码
key-store-password: 123456
# 存储类型
key-store-type: PKCS12
spring:
application:
name: demo-eureka-server
# 开启安全控制
security:
user:
# 用户名
name: eureka-server
# 密码
password: 8e9lx7LuP3436gfsg
eureka:
instance:
# 主机名
hostname: localhost
# 使用 ip 注册到注册中心实例化
prefer-ip-address: true
# 安全端口
secure-port: ${server.port}
# 指示是否应为流量启用安全端口
secure-port-enabled: true
# 关闭非安全端口
non-secure-port-enabled: false
home-page-url: https://${eureka.instance.hostname}:${server.port}/
status-page-url: https://${eureka.instance.hostname}:${server.port}/actuator/info
health-check-url: https://${eureka.instance.hostname}:${server.port}/actuator/health
client:
# 此实例是否从注册中心获取注册信息
fetch-registry: false
# 是否将此实例注册到注册中心
register-with-eureka: false
# 注册地址
service-url:
# 默认注册分区地址
defaultZone: https://${eureka.instance.hostname}:${server.port}/eureka/
server:
# 同步为空时,等待时间
wait-time-in-ms-when-sync-empty: 0
# 是否开启自我保护机制
## 在分布式系统设计里头,通常需要对应用实例的存活进行健康检查,这里比较关键的问题就是要处理好网络偶尔抖动或短暂不可用时造成的误判。另外Eureka Server端与Client端之间如果出现网络分区问题,在极端情况下可能会使得Eureka Server清空部分服务的实例列表,这个将严重影响到Eureka server的 availibility属性。因此Eureka server引入了SELF PRESERVATION机制。
## Eureka client端与Server端之间有个租约,Client要定时发送心跳来维持这个租约,表示自己还存活着。 Eureka通过当前注册的实例数,去计算每分钟应该从应用实例接收到的心跳数,如果最近一分钟接收到的续约的次数小于指定阈值的话,则关闭租约失效剔除,禁止定时任务剔除失效的实例,从而保护注册信息。
# 此处关闭可以防止问题(测试环境可以设置为false):Eureka server由于开启并引入了SELF PRESERVATION模式,导致registry的信息不会因为过期而被剔除掉,直到退出SELF PRESERVATION模式才能剔除。
enable-self-preservation: false
# 指定 Eviction Task 定时任务的调度频率,用于剔除过期的实例,此处未使用默认频率,频率为:5/秒,默认为:60/秒
# 有效防止的问题是:应用实例异常挂掉,没能在挂掉之前告知Eureka server要下线掉该服务实例信息。这个就需要依赖Eureka server的EvictionTask去剔除。
eviction-interval-timer-in-ms: 5000
# 设置read Write CacheMap的expire After Write参数,指定写入多长时间后过期
# 有效防止的问题是:应用实例下线时有告知Eureka server下线,但是由于Eureka server的REST API有response cache,因此需要等待缓存过期才能更新
response-cache-auto-expiration-in-seconds: 60
# 此处不开启缓存,上方配置开启一个即可
# use-read-only-response-cache: false
# 指定每分钟需要收到的续约次数的阈值,默认值就是:0.85
renewal-percent-threshold: 0.85
# 续约频率提高,默认:30
leaseRenewalIntervalInseconds: 10
客户端
server:
port: 11200
spring:
application:
name: demo-goods
eureka:
instance:
hostname: localhost
prefer-ip-address: true
client:
secure-port-enabled: true
ssl:
key-store: EurekaClient.p12
key-store-password: 123456
security:
user:
name: eureka-server
password: 8e9lx7LuP3436gfsg
service-url:
defaultZone: https://${eureka.client.security.user.name}:${eureka.client.security.user.password}@${eureka.instance.hostname}:8761/eureka/
registry-fetch-interval-seconds: 30
在开发微服务应用时,我们会在主程序入口添加 @EnableFeignClients 注解开启对 Feign Client 扫描加载处理。根据 Feign Client 的开发规范,定义接口并加 @FeignClients 注解。
当程序启动时,会进行包扫描,扫描所有 @FeignClients 的注解的类,并将这些信息注入 Spring IOC 容器中。当定义的 Feign 接口中的方法被调用时,通过JDK的代理的方式,来生成具体的 RequestTemplate。当生成代理时,Feign 会为每个接口方法创建一个 RequetTemplate 对象,该对象封装了 HTTP 请求需要的全部信息,如请求参数名、请求方法等信息都是在这个过程中确定的。
然后由 RequestTemplate 生成 Request,然后把 Request 交给 Client 去处理,这里指的 Client 可以是 JDK 原生的 URLConnection、Apache 的 Http Client 也可以是 Okhttp。最后 Client 被封装到 LoadBalanceclient 类,这个类结合 Ribbon 负载均衡发起服务之间的调用。
name:指定 Feign Client 的名称,如果项目使用了 Eureka,name 属性会作为微服务的名称,用于服务发现。
url:url 一般用于调试,可以手动指定 @FeignClient 调用的地址。
decode404:当发生404错误时,如果该字段为 true,会调用 decoder 进行解码,否则抛出 FeignException。
configuration:Feign 配置类,可以自定义 Feign 的 Encoder、Decoder、LogLevel、Contract。
fallback:定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback 指定的类必须实现 @FeignClient 标记的接口。
fallbackFactory:工厂类,用于生成 fallback 类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码。
path:定义当前 FeignClient 的统一前缀。
##这两行即可开启压缩
feign.compression.request.enabled=true
feign.compression.response.enabled=true
## 配置压缩具体信息
feign.compression.request.enabled=true
feign.compression.request.mime-types=text/xml,application/xml,application/json
feign.compression.request.min-request-size=2048
Feign对日志的处理非常灵活,可为每个Feign客户端指定日志记录策略,每个Feign客户端都会创建一个logger。默认情况下,logger的名称是Feigh接口的完整类名。需要注意的是,Feign的日志打印只会对Debug级别做出响应。
我们可以为每个Feign客户端配置各种的Logger.Level对象,告诉Feign记录哪些日志。Logger.Level的值有以下选择。
NONE,无记录(DEFAULT)。
BASIC,只记录请求方法和URL以及响应状态代码和执行时间。
HEADERS,记录基本信息以及请求和响应标头。
FULL,记录请求和响应的头文件,正文和元数据。
开启日志记录
logging.level.com.cnblogs.hellxz.client.EurekaServiceFeign: DEBUG
原文:https://www.cnblogs.com/books148/p/12493496.html