天天看点

springcloud简单入门操作(Hoxton版本)一.搭建springcloud父工程二.创建两个子工程并测试三.Eureka注册中心 四.负载均衡Ribbon五.熔断Hystrix

一.搭建springcloud父工程

1.创建一个maven工程(如图所示,框起来的除外)

springcloud简单入门操作(Hoxton版本)一.搭建springcloud父工程二.创建两个子工程并测试三.Eureka注册中心 四.负载均衡Ribbon五.熔断Hystrix

2.修改为pom.xml改如图处位置为图示范样子

springcloud简单入门操作(Hoxton版本)一.搭建springcloud父工程二.创建两个子工程并测试三.Eureka注册中心 四.负载均衡Ribbon五.熔断Hystrix

3.在pom文件里添加(springboot和springcloud版本号要对应,否则会报错)

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR11</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>      
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
 </parent>      

二.创建两个子工程并测试

1.创建两个子工程,并实现对外访问方法

在其中一个工程的启动类里添加

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

然后创建一个访问类添加如下

@Autowired
 private RestTemplate restTemplate;//Spring提供了一个RestTemplate模板工具类,对基于HTTP的客户端进行了封装,并且实现了对象与json的序列化 和反序列化
    @GetMapping("")
    public Object query(){
        String url="另一个工程对外访问地址";
        return restTemplate.getForObject(url,Object.class);
    }      

2.然后启动两个子工程,可在有RestTemplate对象的工程里访问另一个工程

三.Eureka注册中心

1.创建两个(搭建集群简单演示)子工程并在pom文件里添加

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

在启动类上添加

@EnableEurekaServer      

注解

2.在配置文件里添加

server:
  port: 端口
spring:
  application:
    name: 服务名称
eureka:
  client:
    service-url:
      #EurekaServer地址,多个地址以','隔开
      defaultZone: 另一个服务地址/eureka
  server:
    # 注册自己 
    register-with-eureka: true
    # 抓取服务 
    fetch-registry: true
    eviction-interval-timer-in-ms: 1000      

3.分别启动测试

DiscoveryClient类的方法getInstances("服务名称")可根据服务名称,获取服务实例

List<ServiceInstance> serviceInstances = discoveryClient.getInstances("服务名称");      

4.Eureka Client向Eureka Server进行注册的时候默认采用的是IP Address方式

如果采用主机名的方式进行注册服务,只需要修改配置文件的

eureka.instance.hostname=配置使用主机名注册服务

如果在上面已经配置的情况下想用IP则需要修改配置文件

eureka: 
  instance: 
   # 自定义实例编号
    instance-id: 编号
    ip-address: 127.0.0.1 # ip地址
    prefer-ip-address: true # 更倾向于使用ip,而不是host名      

5.在注册服务完成以后,服务提供者会维持一个心跳,可通过如下修改

eureka: 
  instance: 
    lease-expiration-duration-in-seconds: 90  #服务失效时间,默认值90秒
    lease-renewal-interval-in-seconds: 30 #服务续约(renew)的间隔,默认为30秒      

默认情况下每个30秒服务会向注册中心发送一次心跳,如果超过90秒没有发送心跳,EurekaServer就会认为该服务宕机,会从服务列表中移除

6.拉取并更新数据

服务消费者启动时,会检测 eureka.client.fetch-registry=true 参数的值,如果为true,则会从Eureka Server服务的列表拉取只读备份,然后缓存在本地。每隔30秒 会重新拉取并更新数据。可通过在消费者添加以下配置更改

eureka: 
  client: 
    registry-fetch-interval-seconds: 30      

7.服务剔除与自我保护

服务注册中心在启动时会创建一个定时任务,默认每隔一段时间 (默认为60秒)将当前清单中超时(默认为90秒)没有续约的服务剔除,这个操作被称为失效剔除。 可以通过eureka.server.eviction-interval-timer-in-ms 参数对其进行修改,单位是毫秒。

当一个服务未按时进行心跳续约时,Eureka会统计最近15分钟心跳失败的服 务实例的比例是否超过了85%,当EurekaServer节点在短时间内丢失过多客户端(可能发生了网络分区故障)。在 生产环境下,因为网络延迟等原因,心跳失败实例的比例很有可能超标,但是此时就把服务剔除列表并不妥当,因 为服务可能没有宕机。Eureka就会把当前实例的注册信息保护起来,不予剔除。

可通过下面配置修改

eureka: 
  server: 
    enable-self-preservation: false # 关闭自我保护模式(缺省为打开)         eviction-interval-timer-in-ms: 1000 # 扫描失效服务的间隔时间(缺省为60*1000ms)      

四.负载均衡Ribbon

1.Eureka中已经集成了在RestTemplate的配置方法上添加 @LoadBalanced 注解即可

2.默认是轮询,可通过以下方式配置成随机

服务名称: 
  ribbon: 
    NFLoadBalancerRuleClassName: 
      com.netflix.loadbalancer.RandomRule      

五.熔断Hystrix