• springcloud入门resttemplate&eureka&ribbon&hystrix


    restTemplate.getForObject("http://localhost:18081/user/list", String.class)
     

    1 resttemplate

    创建启动类,并在启动类中创建RestTemplate对象,或者通过配置文件配置bean
        
    @Bean
        public RestTemplate restTemplate(){
            return  new RestTemplate();
        }
    通过RestTemplate的getForObject()方法,传递url地址及实体类的字节码
    RestTemplate会自动发起请求,接收响应
    并且帮我们对响应结果进行反序列化
     
    getForObject.(String url,Class<T> responseType) responseType可以是json也可以是对象,后面也可以第三个参数各种变量
     

    2 微服务,统一在父工程下,方便管理 

    pom文件中管理springcloud包依赖管理
     
    <!--父工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>
    <!--SpringCloud包依赖管理-->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    3 创建服务提供者provider工程

    application.yml中配置端口,数据库源
     

    4 创建服务消费者consumer工程

    在启动类中创建resttemplate实例并放到spring容器中@bean
     
    配置端口
     
    在控制器中注入RestTemplate实例,接受响应后对结果进行反序列化
        @GetMapping(value = "/{id}")
        public User queryById(@PathVariable(value = "id")Integer id){
            String url = "http://localhost:18081/user/find/"+id;
            return restTemplate.getForObject(url,User.class);
        }

    5 注册中心 spring cloud eureka 管理服务,发现、注册、状态监听(心跳机制,续约)、动态路由

     
    搭建eureka-server工程
    pom文件引入eureka服务依赖(对应地其他服务pom文件上要引入eureka客户端依赖)
     
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-netflix-eureka-server</artifactId>
    </dependency>
     
    application.yml配置
    配置应用名称spring:application:name:,作为eureka中服务的id标识,所有要被eureka管理的都要加上;名字对应url,如果是集群,名字需相同
     
    配置EurekaServer的地址 eureka:client:service-url:defaultZone: http://localhost:7001/eureka  所有服务都配置
     
    server:
      port: 7001    #端口号
    spring:
      application:
        name: eureka-server # 应用名称,会在Eureka中作为服务的id标识(serviceId)
    eureka:
      client:
        register-with-eureka: false   #是否将自己注册到Eureka中
        fetch-registry: false   #是否从eureka中获取服务信息
        service-url:
          defaultZone: http://localhost:7001/eureka # EurekaServer的地址
     
    启动类加注解@EnableEurekaServer //开启Eureka服务
    对应地要在其他服务启动类上加上注解 @EnableDiscoveryClient或者@EnableEurekaClient,用于开启客户端发现功能。 1.5.8.RELEASE对应的 Spring Cloud Edgware以后客户端可以省略这个注解了
     
    eureka其他配置
    自我保护与实效剔除
    Eureka会统计服务提供者实例,最近15分钟心跳续约的比例是否低于85%,如果低于则会触发自我保护机制
    server:
      enable-self-preservation: false  #关闭自我保护,默认true开启
      eviction-interval-timer-in-ms: 5000  #租约到期后5秒内没续约就剔除

    6 消费者服务器

    pom引入eureka客户端,启动类加上发现客户端注解,配置文件配置serviceId及EurekaServer地址
     
    控制器
    1)自动注入DiscoveryClient对象
    DiscoveryClient有方法getInstances(String serviceId)能通过serviceId(即配置的application name)拿到对应的所有服务instances,进而get(0)拿到第一个serviceInstance,就可拿到服务的ip与端口
     
    List<ServiceInstance> instances = discoveryClient.getInstances("user-provider");
    ServiceInstance serviceInstance = instances.get(0);
     
    String serviceUrl = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/user/" + id;
    2)或者直接通过serviceId替代ip与端口,application name包含了ip与端口
     
    String serviceUrl = "http://user-provider/user/" + id;

    7 服务提供者其他配置

    使用ip访问配置,可以不配置,推荐使用
    eureka:
      instance:
        #指定IP地址
        ip-address: 127.0.0.1
        #访问服务的时候,推荐使用IP
        prefer-ip-address: true
        #租约到期,服务时效时间,默认值90秒
        lease-expiration-duration-in-seconds: 15
        #租约续约间隔时间,默认30秒
        lease-renewal-interval-in-seconds: 40  
     
    注册(被)抓取间隔时间配置
    registry-fetch-interval-seconds: 30

    8 spring cloud ribbon负载均衡

    1)工程拷贝
    拷贝--改文件名--改pom文件artifactId--在父工程pom文件添加对应module--改端口
    2)开启负载均衡
    在resttemplate配置方法上添加@loadbalanced注解
    3)consumer不再手动获取ip,通过服务名调用,通过serviceId替代ip与端口
    4)负载均衡策略配置
    user-provider: #不能省要告诉我对哪个服务提供者进行负载均衡
    # 修改服务地址轮询策略,默认是轮询,配置之后变随机↑
    user-provider: #不能省要告诉我对哪个服务提供者进行负载均衡,NFLoadBalancerRuleClassName忘了搜ccckey里面找带有负载均衡规则类名,接下来赋值类,基本上你会写随机规则类或者轮询规则,但是不写配置就是轮询
      ribbon:
        #轮询
        #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule
        #随机算法
        #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
        #重试算法,该算法先按照轮询的策略获取服务,如果获取服务失败则在指定的时间内会进行重试,获取可用的服务↓
        #可以在idea软件中按ctr shift n或者t搜对应的类进行其中一种算法涉及时间的说明↑
        #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RetryRule
        #加权法,会根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越大。刚启动时如果统计信息不足,则使用轮询的策略,等统计信息足够,才会切换到自身规则。
        NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule

    9 spring cloud hystrix熔断器

    熔断器核心:线程隔离与服务降级
    1)在consumer中引入熔断器依赖
    2)启动类开启 @EnableCircuitBreaker注解
    这里可以直接用@springcloudapplication注解相当于@springbootapplication、@enablediscoveryclient、@enablecircuitbreaker三个注解
    3)降级处理
    局部降级方法
    需降级方法上加@HystrixCommand(fallbackMethod = "fallback")注解(这里的fallback为方法名),并写对应降级方法,除了方法名和方法体其他要完全一致
    全局降级方法
    @DefaultProperties(defaultFallback=”defaultFailBack“),在类上,指明统一的失败降级方法;需降级方法上仍需加@HystrixCommand注解,只是不赋值
     
    熔断策略配置
    # 配置熔断策略:
    hystrix:
      command:
        default:
          circuitBreaker:
            # 强制打开熔断器 默认false关闭的。测试配置是否生效
            forceOpen: false
            # 触发熔断错误比例阈值,默认值50%!!!
            errorThresholdPercentage: 50
            # 熔断后休眠时长,默认值5秒,即睡眠5秒去看服务如果没有问题,熔断器由半开到关闭,恢复服务的访问
            sleepWindowInMilliseconds: 10000
            # 熔断触发最小请求次数,默认值是20,即请求访问服务,服务出现错误2次开始触发熔断全开
            requestVolumeThreshold: 2
          execution:
            isolation:
              thread:
                # 熔断降级超时设置,默认为1秒,即访问服务耗时超过1秒就服务降级
                timeoutInMilliseconds: 2000
     
  • 相关阅读:
    python标准库学习-SimpleHTTPServer
    迁移cnblog博客
    zabbix监控使用
    20 个 OpenSSH 最佳安全实践
    编写基本的 udev 规则
    Linux.Siggen.180
    在 CentOS 7.0 上安装配置 Ceph 存储
    常用 GDB 命令中文速览
    Kubernetes TLS认证
    音乐下载api
  • 原文地址:https://www.cnblogs.com/21556guo/p/14089135.html
Copyright © 2020-2023  润新知