SpringCloud之(二)服务治理【Eureka】

环境配置

  • 基于【SpringBoot2.0】,【SpringCloud-Finchley.RELEASE】的基础开发。

构建服务注册中心

构建【Eureka服务注册中心】流程
  • maven配置
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
</parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>  
    </dependencyManagement>
  • 启动类
@SpringBootApplication
@EnableEurekaServer
public class ServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServerApplication.class,args);
    }
}
  • yaml配置
server:
  port: 6200
eureka:
  instance:
    hostname: localhost
    prefer-ip-address: true
  client:
    fetch-registry: false
    register-with-eureka: false
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
构建【Eureka服务提供者】
  • maven配置
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
</parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>  
    </dependencyManagement>
  • 启动类
@EnableDiscoveryClient
@SpringBootApplication
public class BootApplication {

    public static void main(String[] args) {
        SpringApplication.run(BootApplication.class, args);
    }
}
  • yaml配置
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:6200/eureka/
  instance:
    prefer-ip-address: true
  • 创建服务
@RestController
public class serviceController {

    @Autowired
    private DiscoveryClient client;

    @RequestMapping(value = "/helloEureka",method = RequestMethod.GET)
    public String hello(){
        return "Hello World";
    }
}
构建【Ribbon消费者】
  • Maven配置
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
</parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Finchley.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>  
    </dependencyManagement>
  • 启动类
@SpringBootApplication
@EnableDiscoveryClient
public class ComsuerRibbonApplication {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate(){
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(ComsuerRibbonApplication.class, args);
    }
}
  • Yaml配置
spring:
  application:
    name: consumer-ribbon
server:
  port: 6300
eureka:
  client:
    service-url:
      defaultZone: http://localhost:6200/eureka
  • 消费类
@RestController
public class ConsummerController {

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/helloRibbon")
    public String helloConsumer(){
        String url = "http://HELLO-EUREKA/helloEureka";
        return restTemplate.getForEntity(url,String.class).getBody();
    }
}

Eureka的基础架构

服务注册中心
  • Eureka提供的服务注册和发现的功能

失效剔除

  • 默认每隔60s会把当前服务清单中续约超时【默认90s】的服务剔除。

自我保护

  • EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
  • 在运行期间,会统计心跳失败的比例在15分钟内是否低于【85%】,如果低于的情况,EurekaServer会把当前注册的实例保护起来,让这些实例不会失效,这很容易出现服务消费者调用到失效的服务。所以客户端需要有重试机制或者断路器等容错机制。
  • 相关配置
//关闭自我保护机制
enruka.server.enable-self-preservation=false
服务提供者
  • 提供服务的应用

服务注册

  • 启动时,会通过发送【REST】的请求把自己注册到【Eureka】的server,注册时需要使【Eureka.client.register-with-eureka=true】

服务同步

  • 如果两个服务提供者分别注册到A,B两个Server,而A和B同时又互相注册,则A,B将实现服务同步,也就是通过服务同步,连接到A,B的任意一台消费者可以消费所有的服务。

服务续约

  • 注册完服务,服务提供者将会维护一个心跳给server通知,目前服务尚未失效。
  • 相关配置
//定义服务续约的‘心跳’间隔。默认30s
eureka.instance.lease-renewal-interval-in-seconds=30
//定义服务失效时间,默认90s
eureka.instance.lease-expiration-duration-in-seconds=90
服务消费者
  • 消费者从注册中心获取服务列表,有Ribbon和Fegin两种方式

获取服务

  • Eureka-Server会维护一份只读服务清单定时传送给服务消费者,默认缓存清单每隔30s更新一次。
  • 相关配置
//获取服务
eureka.client.fetch-registry=true
//定时获取服务列表
eureka.client.register-fetch-interval-seconds=30s

服务调用

  • 服务消费者获取服务消费清单后,通过服务名可以获取到具体服务名的实例名和该实例的元数据信息。

服务下线

  • 当服务实例进行正常关闭活动后,会触发一个服务下线的REST给Server,server就会把该服务的状态置为下线【down】

Eureka基础架构

这里写图片描述

Eureka的服务治理机制

Eureka的配置

服务消费者配置
参数名说明默认值
RegistryFetchIntervalSeconds从eureka服务器注册表中获取注册信息的时间间隔(s)30s
InstanceInfoReplicationIntervalSeconds复制实例变化信息到eureka服务器所需要的时间间隔(s)30s
InitialInstanceInfoReplicationIntervalSeconds最初复制实例信息到eureka服务器所需的时间(s)40s
EurekaServiceUrlPollIntervalSeconds询问Eureka服务url信息变化的时间间隔(s)300s
ProxyHost获取eureka服务的代理主机
ProxyProxyPort获取eureka服务的代理端口
ProxyUserName获取eureka服务的代理用户名
ProxyPassword获取eureka服务的代理密码
GZipContenteureka注册表的内容是否被压缩true,并且是在最好的网络流量下被压缩
EurekaServerReadTimeoutSecondseureka需要超时读取之前需要等待的时间8秒
EurekaServerConnectTimeoutSecondseureka需要超时连接之前需要等待的时间5秒
BackupRegistryImpl获取实现了eureka客户端在第一次启动时读取注册表的信息作为回退选项的实现名称
EurekaServerTotalConnectionseureka客户端允许所有eureka服务器连接的总数目200
EurekaServerTotalConnectionsPerHosteureka客户端允许eureka服务器主机连接的总数目50
EurekaServerURLContext表示eureka注册中心的路径,如果配置为eureka,则为http://x.x.x.x:x/eureka/,在eureka的配置文件中加入此配置表示eureka作为客户端向注册中心注册,从而构成eureka集群。此配置只有在eureka服务器ip地址列表是在DNS中才会用到
EurekaServerPort获取eureka服务器的端口,此配置只有在eureka服务器ip地址列表是在DNS中才会用到
EurekaServerDNSName获取要查询的DNS名称来获得eureka服务器,此配置只有在eureka服务器ip地址列表是在DNS中才会用到
UseDnsForFetchingServiceUrlseureka客户端是否应该使用DNS机制来获取eureka服务器的地址列表false
RegisterWithEureka实例是否在eureka服务器上注册自己的信息以供其他服务发现true
PreferSameZoneEureka实例是否使用同一zone里的eureka服务器默认为true,理想状态下,eureka客户端与服务端是在同一zone下
AllowRedirects服务器是否能够重定向客户端请求到备份服务器。 如果设置为false,服务器将直接处理请求,如果设置为true,它可能发送HTTP重定向到客户端。默认为false
LogDeltaDiff是否记录eureka服务器和客户端之间在注册表的信息方面的差异默认为false
DisableDelta(*)默认为false
fetchRegistryForRemoteRegionseureka服务注册表信息里的以逗号隔开的地区名单,如果不这样返回这些地区名单,则客户端启动将会出错默认为null
Region获取实例所在的地区us-east-1
AvailabilityZones获取实例所在的地区下可用性的区域列表,用逗号隔开。
EurekaServerServiceUrlsEureka服务器的连接,默认为http://XXXX:X/eureka/,但是如果采用DNS方式获取服务地址,则不需要配置此设置。
FilterOnlyUpInstances(*)是否获得处于开启状态的实例的应用程序过滤之后的应用程序默认为true
EurekaConnectionIdleTimeoutSecondsEureka服务的http请求关闭之前其响应的时间默认为30 秒
FetchRegistry此客户端是否获取eureka服务器注册表上的注册信息默认为true
RegistryRefreshSingleVipAddress此客户端只对一个单一的VIP注册表的信息感兴趣默认为null
HeartbeatExecutorThreadPoolSize(*)心跳执行程序线程池的大小默认为5
HeartbeatExecutorExponentialBackOffBound(*)心跳执行程序回退相关的属性,是重试延迟的最大倍数值默认为10
CacheRefreshExecutorThreadPoolSize(*)执行程序缓存刷新线程池的大小默认为5
CacheRefreshExecutorExponentialBackOffBound执行程序指数回退刷新的相关属性,是重试延迟的最大倍数值默认为10
DollarReplacementeureka服务器序列化/反序列化的信息中获取“$”符号的的替换字符串默认为“_-”
EscapeCharReplacementeureka服务器序列化/反序列化的信息中获取“”符号的的替换字符串。默认为“_
OnDemandUpdateStatusChange(*)如果设置为true,客户端的状态更新将会点播更新到远程服务器上,默认为true
EncoderName这是一个短暂的编码器的配置,如果最新的编码器是稳定的,则可以去除
DecoderName这是一个短暂的解码器的配置,如果最新的解码器是稳定的,则可以去除
ClientDataAccept(*)客户端数据接收
Experimental(*)当尝试新功能迁移过程时,为了避免配置API污染,相应的配置即可投入实验配置部分
服务提供者配置
参数名说明默认值
InstanceId此实例注册到eureka服务端的唯一的实例ID,其组成为 spring.application.name: s p r i n g . a p p l i c a t i o n . n a m e : {spring.application.instance_id:${random.value}}
Appname获得在eureka服务上注册的应用程序的名字默认为unknow
AppGroupName获得在eureka服务上注册的应用程序组的名字默认为unknow
InstanceEnabledOnit(*)实例注册到eureka服务器时,是否开启通讯默认为false
NonSecurePort获取该实例应该接收通信的非安全端口默认为80
SecurePort获取该实例应该接收通信的安全端口默认为443
NonSecurePortEnabled该实例应该接收通信的非安全端口是否启用默认为true
SecurePortEnabled该实例应该接收通信的安全端口是否启用默认为false
LeaseRenewalIntervalInSecondseureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着默认为30 秒
LeaseExpirationDurationInSecondsEureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除默认为90秒
VirtualHostName此实例定义的虚拟主机名,其他实例将通过使用虚拟主机名找到该实例。
SecureVirtualHostName此实例定义的安全虚拟主机名
ASGName(*)与此实例相关联 AWS自动缩放组名称。此项配置是在AWS环境专门使用的实例启动,它已被用于流量停用后自动把一个实例退出服务。
HostName与此实例相关联的主机名,是其他实例可以用来进行请求的准确名称
MetadataMap(*)获取与此实例相关联的元数据(key,value)。这个信息被发送到eureka服务器,其他实例可以使用。
DataCenterInfo(*)该实例被部署在数据中心
IpAddress获取实例的ip地址
StatusPageUrlPath(*)获取此实例状态页的URL路径,然后构造出主机名,安全端口等默认为/info
StatusPageUrl(*)获取此实例绝对状态页的URL路径,为其他服务提供信息时来找到这个实例的状态的路径默认为null
HomePageUrlPath(*)获取此实例的相关主页URL路径,然后构造出主机名,安全端口等默认为/
HomePageUrl(*)获取此实例的绝对主页URL路径,为其他服务提供信息时使用的路径默认为null
HealthCheckUrlPath获取此实例的相对健康检查URL路径默认为/health
HealthCheckUrl获取此实例的绝对健康检查URL路径默认为null
SecureHealthCheckUrl获取此实例的绝对安全健康检查网页的URL路径默认为null
DefaultAddressResolutionOrder获取实例的网络地址默认为[]
Namespace获取用于查找属性的命名空间默认为eureka

服务注册中心配置

参数名说明默认值
AWSAccessId获取aws访问的id,主要用于弹性ip绑定,此配置是用于aws上的默认为null
AWSSecretKey获取aws私有秘钥,主要用于弹性ip绑定,此配置是用于aws上的默认为null
EIPBindRebindRetries获取服务器尝试绑定到候选的EIP的次数默认为3
EIPBindingRetryIntervalMsWhenUnbound(*)服务器检查ip绑定的时间间隔,单位为毫秒默认为1 * 60 * 1000
EIPBindingRetryIntervalMs与上面的是同一作用,仅仅是稳定状态检查默认为5 * 60 * 1000
EnableSelfPreservation自我保护模式,当出现出现网络分区、eureka在短时间内丢失过多客户端时,会进入自我保护模式,即一个服务长时间没有发送心跳,eureka也不会将其删除默认为true
RenewalPercentThreshold(*)阈值因子默认是0.85,如果阈值比最小值大,则自我保护模式开启
RenewalThresholdUpdateIntervalMs阈值更新的时间间隔,单位为毫秒默认为15 * 60 * 1000
PeerEurekaNodesUpdateIntervalMs(*)集群里eureka节点的变化信息更新的时间间隔,单位为毫秒默认为10 * 60 * 1000
EnableReplicatedRequestCompression复制的数据在发送请求时是否被压缩默认为false
NumberOfReplicationRetries获取集群里服务器尝试复制数据的次数默认为5
PeerEurekaStatusRefreshTimeIntervalMs服务器节点的状态信息被更新的时间间隔,单位为毫秒默认为30 * 1000
WaitTimeInMsWhenSyncEmpty(*)在Eureka服务器获取不到集群里对等服务器上的实例时,需要等待的时间,单位为毫秒默认为1000 * 60 * 5
PeerNodeConnectTimeoutMs连接对等节点服务器复制的超时的时间,单位为毫秒默认为200
PeerNodeReadTimeoutMs读取对等节点服务器复制的超时的时间,单位为毫秒默认为200
PeerNodeTotalConnections获取对等节点上http连接的总数默认为1000
PeerNodeTotalConnectionsPerHost(*)获取特定的对等节点上http连接的总数默认为500
PeerNodeConnectionIdleTimeoutSeconds(*)http连接被清理之后服务器的空闲时间默认为30秒
RetentionTimeInMSInDeltaQueue(*)客户端保持增量信息缓存的时间,从而保证不会丢失这些信息,单位为毫秒默认为3 * 60 * 1000
DeltaRetentionTimerIntervalInMs清理任务程序被唤醒的时间间隔,清理过期的增量信息,单位为毫秒默认为30 * 1000
EvictionIntervalTimerInMs过期实例应该启动并运行的时间间隔,单位为毫秒默认为60 * 1000
ASGQueryTimeoutMs(*)查询AWS上ASG(自动缩放组)信息的超时值,单位为毫秒默认为300
ASGUpdateIntervalMs从AWS上更新ASG信息的时间间隔,单位为毫秒默认为5 * 60 * 1000
ASGCacheExpiryTimeoutMs(*)缓存ASG信息的到期时间,单位为毫秒默认为10 * 60 * 1000
ResponseCacheAutoExpirationInSeconds(*)当注册表信息被改变时,则其被保存在缓存中不失效的时间默认为180秒
ResponseCacheUpdateIntervalMs(*)客户端的有效负载缓存应该更新的时间间隔默认为30 * 1000毫秒
UseReadOnlyResponseCache(*)目前采用的是二级缓存策略,一个是读写高速缓存过期策略,另一个没有过期只有只读缓存默认为true,表示只读缓存
DisableDelta(*)增量信息是否可以提供给客户端看默认为false
MaxIdleThreadInMinutesAgeForStatusReplication(*)状态复制线程可以保持存活的空闲时间默认为10分钟
MinThreadsForStatusReplication被用于状态复制的线程的最小数目默认为1
MaxThreadsForStatusReplication被用于状态复制的线程的最大数目默认为1
MaxElementsInStatusReplicationPool可允许的状态复制池备份复制事件的最大数量默认为10000
SyncWhenTimestampDiffers当时间变化实例是否跟着同步默认为true
RegistrySyncRetries当eureka服务器启动时尝试去获取集群里其他服务器上的注册信息的次数默认为5
RegistrySyncRetryWaitMs当eureka服务器启动时获取其他服务器的注册信息失败时,会再次尝试获取,期间需要等待的时间默认为30 * 1000毫秒
MaxElementsInPeerReplicationPool(*)复制池备份复制事件的最大数量默认为10000
MaxIdleThreadAgeInMinutesForPeerReplication(*)复制线程可以保持存活的空闲时间默认为15分钟
MinThreadsForPeerReplication(*)获取将被用于复制线程的最小数目默认为5
MaxThreadsForPeerReplication获取将被用于复制线程的最大数目默认为20
MaxTimeForReplication(*)尝试在丢弃复制事件之前进行复制的时间默认为30000毫秒
PrimeAwsReplicaConnections(*)对集群中服务器节点的连接是否应该准备默认为true
DisableDeltaForRemoteRegions(*)增量信息是否可以提供给客户端或一些远程地区默认为false
RemoteRegionConnectTimeoutMs(*)连接到对等远程地eureka节点的超时时间默认为1000毫秒
RateLimiterFullFetchAverageRate(*)速率限制器用的是令牌桶算法,此配置指定平均执行请求速率,默认为100
ListAutoScalingGroupsRoleName(*)用来描述从AWS第三账户的自动缩放组中的角色名称,默认为“ListAutoScalingGroups”
JsonCodecName(*)如果没有设置默认的编解码器将使用全JSON编解码器,获取的是编码器的类名称
XmlCodecName(*)如果没有设置默认的编解码器将使用xml编解码器,获取的是编码器的类名称
BindingStrategy(*)获取配置绑定EIP或Route53的策略。
Route53DomainTTL(*)用于建立route53域的ttl,默认为301
Route53BindRebindRetries(*)服务器尝试绑定到候选Route53域的次数,默认为3
Route53BindingRetryIntervalMs(*)服务器应该检查是否和Route53域绑定的时间间隔默认为5 * 60 * 1000毫秒
Experimental(*)当尝试新功能迁移过程时,为了避免配置API污染,相应的配置即可投入实验配置部分默认为null
RemoteRegionReadTimeoutMs(*)获取从远程地区eureka节点读取信息的超时时间默认为1000毫秒
RemoteRegionTotalConnections获取远程地区对等节点上http连接的总数默认为1000
RemoteRegionTotalConnectionsPerHost获取远程地区特定的对等节点上http连接的总数默认为500
RemoteRegionConnectionIdleTimeoutSecondshttp连接被清理之后远程地区服务器的空闲时间默认为30秒
GZipContentFromRemoteRegion(*)eureka服务器中获取的内容是否在远程地区被压缩默认为true
RemoteRegionUrlsWithName针对远程地区发现的网址域名的map
RemoteRegionUrls远程地区的URL列表
RemoteRegionAppWhitelist(*)必须通过远程区域中检索的应用程序的列表
RemoteRegionRegistryFetchInterval从远程区域取出该注册表的信息的时间间隔默认为30秒
RemoteRegionFetchThreadPoolSize用于执行远程区域注册表请求的线程池的大小默认为20
RemoteRegionTrustStore用来合格请求远程区域注册表的信任存储文件默认为空
RemoteRegionTrustStorePassword获取偏远地区信任存储文件的密码默认为“changeit”
disableTransparentFallbackToOtherRegion(*)如果在远程区域本地没有实例运行,对于应用程序回退的旧行为是否被禁用默认为false
BatchReplication(*)表示集群节点之间的复制是否为了网络效率而进行批处理默认为false
LogIdentityHeaders(*)Eureka服务器是否应该登录clientAuthHeaders默认为true
RateLimiterEnabled限流是否应启用或禁用默认为false
RateLimiterThrottleStandardClients是否对标准客户端进行限流默认false
RateLimiterPrivilegedClients(*)认证的客户端列表,这里是除了标准的eureka Java客户端。
RateLimiterBurstSize(*)速率限制的burst size默认为10,这里用的是令牌桶算法
RateLimiterRegistryFetchAverageRate(*)速率限制器用的是令牌桶算法,此配置指定平均执行注册请求速率默认为500
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值