精华内容
下载资源
问答
  • 2.超时时间应该:zuul > hystrix > ribbon (否则重试完成之前会被熔断) 2.当服务中设置了hystrix,以每个服务的设置为准(好像不对???) 3.ribbon超时 = (ribbonReadTimeout + ribbonConnectTimeout) * ...

    0.需要引入:
        <!-- 重试机制 ,否则重试不生效 -->
        <dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
        </dependency>
    1.需要配置:zuul.retryable=true  和  spring.cloud.loadbalancer.retry.enabled=true
    2.超时时间应该:zuul > hystrix > ribbon (否则重试完成之前会被熔断)
    2.当服务中设置了hystrix,以每个服务的设置为准(好像不对???)
    3.ribbon超时 = (ribbonReadTimeout + ribbonConnectTimeout) * (maxAutoRetries + 1) * (maxAutoRetriesNextServer + 1);(发现:重试失败之后,熔断超时之前,也会熔断)
    4.OKToRetryOnAllOperations无论请求超时或者socket read timeout都进行重试,(不建议开启,默认读取请求重试,新增修改不重试)
        为true时:
            post:重试
            get:重试
            put:重试
            delete重试
        为false时:(ReadTimeout之后直接熔断)
            post不
            get重试
            put不
            delete不
    5.httpClient默认重试策略DefaultHttpRequestRetryHandler针对连接超时和获取数据超时并不会重试,需要自定义重试策略。

    展开全文
  • springCloud——ribbonzuul

    千次阅读 2020-05-26 21:46:36
    ribbon 引入: 作为springCloud的第二个核心技术,ribbon的作用是调用在注册中心注册好的服务,它又有两个使用方式,一是服务之间的调用会使用ribbon技术,二是前端的调用服务也会使用ribbon,接下来分别做解释。...

    ribbon

    引入:
    作为springCloud的第二个核心技术,ribbon的作用是调用在注册中心注册好的服务,它又有两个使用方式,一是服务之间的调用会使用ribbon技术,二是前端的调用服务也会使用ribbon,接下来分别做解释。还有一个作用,ribbon它在调用服务的时候,会做负载均衡。

    ribbon的调用逻辑:
    ribbon要调用服务,就需要去服务中心获取记录服务信息的双层map。ribbon因为需要抓取map信息,所以它也需要去注册中心注册。
    在这里插入图片描述
    ribbon之服务调用服务:
    1.首先在pom中引入依赖

     <!--eureka-client依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
    <!--ribbon-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-ribbon</artifactId>
            </dependency>
    

    2.在application文件中添加信息

    server.port=8094
    #给功能启一个服务名称 service-hi
    spring.application.name=service-ribbon
    #ip优先相互通信
    eureka.instance.prefer-ip-address=true
    #注册中心实现服务的注册
    eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka
    

    3.在启动类中写一个写一个特殊的方法

        @Bean
        @LoadBalanced
        public RestTemplate initRestTemplate(){
            return new RestTemplate();
        }
    

    4.在需要调用其他服务的方法中写如下代码:

        @Autowired
        private RestTemplate template;
    
    String url="http://test-user/user/update/point?money="+order.getOrderMoney();
    Integer success=template.getForObject(url,Integer.class);
    

    这里url中的test-user是一个注册在注册中心的服务,当使用这种跳转方式的时候,ribbon会拿着这个服务名test-user,去map中寻找对应的服务信息,这里ribbon还会做负载均衡,找到之后把这个服务的地址替换掉test-user,并且和后面的路径拼接,这样就可以去访问了。

    ribbon之zuul的调用:
    zuul是什么后面会说,这个调用后面也会细说,这里先暂时看一下。
    所谓的zuul调用,就是zuul网关匹配url成功后,他会调用内部的ribbon去把注册的服务地址拼接到url上,实现服务的调用

    zuul:

    引入:
    zuul是一个网关,作用是整个微服务集群的唯一入口。

    功能:
    路由:根据nginx传递过来的不同请求地址,调用不同的微服务。
    过滤(拦截): 网关中实现请求的鉴权工作(符不符合参数要求,是否携带身份信息,是否合法)

    实现一个zuul网关:
    1.在pom文件中加入注解:下面可以看出我们不止依赖了zuul,还依赖了eureka,这是因为一但路由成功后,将会启动zuul内部的ribbon来进行微服务访问,既然要使用ribbon就需要抓取注册中心的map,所以这里需要依赖eureka。

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

    2.书写启动类:

    @SpringBootApplication
    @EnableEurekaClient
    @EnableZuulProxy
    public class StarterGateway {
        public static void main(String[] args) {
            SpringApplication.run(StarterGateway.class,args);
        }
    }
    

    3.书写application配置文件(这里很重要):

    server.port=8103
    #给功能启一个服务名称 service-hi
    spring.application.name=gate-way
    #ip优先相互通信
    eureka.instance.prefer-ip-address=true
    #访问的注册中心接口,eureka-cliet会使用服务名称service-hi到
    #注册中心实现服务的注册
    eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka
            
    #test-user
    zuul.routes.t-user.path=/zuul-tuser/**
    zuul.routes.t-user.service-id=test-user
    #test-order
    zuul.routes.t-order.path=/zuul-torder/**
    zuul.routes.t-order.service-id=test-order
    

    上面的后面几行,就是网关的路由规则,zuul.routes是写死的,后面紧接的是自定义路由名称,最后的path是匹配规范,只有满足这个匹配规范的请求,才会去使用service-id中的微服务名称所对应的微服务地址去替换原来请求连接中的匹配规则,这样才可以访问到微服务(例如:/zuul-tuser/**表示只要请求到网关的uri地址是以/zuul-tuser/开始的就满足匹配)。

    匹配规则:

    ?: 表示匹配一级单个字符,例如:path=/zuul-a/?,可以匹配到/zuul-a/a,/zuul-a/b,不能匹配/zuul-a/abc,/zuul-a/a/b/c
     
    *: 表示匹配一级任意字符串,例如:path=/zuul-a/*,可以匹配到/zuul-a/a,/zuul-a/abc,不能匹配/zuul-a/a/b/c
     
    **:表示匹配任意多级任意字符串,例如:path=/zuul-a/**,可以匹配到/zuul-a/a,/zuul-a/abc,/zuul-a/a/b/c.没有不能匹配的
    

    整个微服务的项目结构:
    在这里插入图片描述
    解释:浏览器首先发送一个请求,这个请求会被nginx拦截,然后做地址匹配,如果匹配上了,就会调用nginx中写好的网关地址,在网关中如果新的地址满足网关的匹配规则,网关就就会把对应的服务地址拿去替换掉匹配规则,又生成了一个新的请求地址,这个地址就去访问微服务。
    这里面可以看出,在nginx上可以做负载均衡,zuul网关在进行微服务调用也有负载均衡,微服务之间的调用同样也有负载均衡。

    nginx中的地址书写:
    可以分为下面三块,从左向右:第一块是书写网关的地址,第二块是书写网关的匹配规则地址,第三块是微服务中的requestMapping
    在这里插入图片描述
    调用过程的地址变化:
    nginx:

    server {
            #配置www.ou.com 访问8091ou系统
            listen 80;
            server_name www.ou.com;
            location /{
                    root easymall;
            }
            location =/user/query/point {
                    #通过访问网关
                    proxy_pass http://localhost:8103/zuul-tuser/user/query/point;
            }
            #积分更新
            location =/user/update/point {
                    proxy_pass http://localhost:8103/zuul-tuser/user/update/point;
            }
            location =/order/pay {
                    proxy_pass http://localhost:8103/zuul-torder/order/pay;
            }
    }
    

    zuul:

    #test-user
    zuul.routes.t-user.path=/zuul-tuser/**
    zuul.routes.t-user.service-id=test-user
    
    #test-order
    zuul.routes.t-order.path=/zuul-torder/**
    zuul.routes.t-order.service-id=test-order
    

    在这里插入图片描述

    展开全文
  • Zuul配置请求重试的方式,与Ribbon完全一致。 作者:吴俊达 链接:http://www.jianshu.com/p/cb69bb385d24 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 ...

    来源 :

    http://www.jianshu.com/p/5246ca996360

    以下配置基于spring boot版本1.4.5.RELEASE,spring cloud版本采用Camden.SR6。

    工程环境如下:


    Paste_Image.png

    可以看到,compute-service服务包含了两个实例,实例1的端口号为2221、实例2的端口号2222。
    通过http://localhost:3333/add访问的时候,如果使用的是实例1,返回30;如果使用的是实例2,返回150;通过重复刷新http://localhost:3333/add,交替返回30和150,可以发现,此时通过ribbon,已经实现了客户端负载均衡。

    此时,关闭实例2,再次不断刷新http://localhost:3333/add,会交替返回30和“Whitelabel Error Page”的异常页面。可见,在访问到实例2的时候,直接返回了“Connection refused”的问题。

    为了解决这个问题,需要加入重试机制,在访问到实例2的时候, 遇到“Connection refused”,能够向实例1发起重试请求,从而返回正确结果。

    在ribbon工程的application.xml文件里面,加入如下配置:

    # 重试机制
    spring.cloud.loadbalancer.retry.enabled = true
    
    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 10000
    
    compute-service.ribbon.ConnectTimeout = 250
    compute-service.ribbon.ReadTimeout = 1000
    
    # 对所有操作请求都进行重试
    compute-service.ribbon.OkToRetryOnAllOperations = true
    
    # 切换实例的重试次数
    compute-service.ribbon.MaxAutoRetriesNextServer = 2
    
    # 对当前实例的重试次数
    compute-service.ribbon.MaxAutoRetries = 1

    按照之前的步骤测试,仍然交替返回30和“Whitelabel Error Page”的异常页面,可见重试机制并未起效。

    此时,在pom文件加入spring-boot-starter-actuator模块

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    重启ribbon工程,观察http://localhost:3333/autoconfig,在negativeMatches下面,找到如下配置:


    Paste_Image.png

    可以看到,这里给出的提示是:RibbonAutoConfiguration.loadBalancedRetryPolicyFactory方法没有找到RetryTemplate的依赖。
    通过观察RibbonAutoConfiguration类的源码,可以看到如下代码:

    @Bean
    @ConditionalOnClass(name = "org.springframework.retry.support.RetryTemplate")
    public LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory(SpringClientFactory clientFactory) {
        return new RibbonLoadBalancedRetryPolicyFactory(clientFactory);
    }

    可见,在存在RetryTemplate依赖的前提下,才能获得有效的ribbon负载均衡重试策略工厂。
    接下来,在pom文件,加入spring-retry的依赖:

    <dependency>
        <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
    </dependency>

    重启ribbon工程,重复刷新http://localhost:3333/add,在compute-service服务的实例1和实例2都正常的情况下,交替返回30和150;
    此时,关闭实例2,再次重复刷新http://localhost:3333/add,会发现,一直返回30。只是,有时候会有1秒左右的延时,可见此时是在向实例2请求的时候,发生了“Connection refused”,然后再向实例1重试发送请求。
    可见,重试机制已经生效。

    此时,再观察http://localhost:3333/autoconfig,在negativeMatches下面,会看到如下配置:


    Paste_Image.png


    通过观察RibbonAutoConfiguration类的源码,可以看到如下代码:

    @Bean
    @ConditionalOnMissingClass(value = "org.springframework.retry.support.RetryTemplate")
    public LoadBalancedRetryPolicyFactory neverRetryPolicyFactory() {
        return new LoadBalancedRetryPolicyFactory.NeverRetryFactory();
    }

    可见,要让重试机制不生效,需要去掉RetryTemplate的依赖。
    继续跟踪LoadBalancedRetryPolicyFactory的源码

    public interface LoadBalancedRetryPolicyFactory {
    
        public LoadBalancedRetryPolicy create(String serviceId, ServiceInstanceChooser serviceInstanceChooser);
    
        static class NeverRetryFactory implements LoadBalancedRetryPolicyFactory {
    
            @Override
            public LoadBalancedRetryPolicy create(String serviceId, ServiceInstanceChooser serviceInstanceChooser) {
                return null;
            }
        }
    }

    发现NeverRetryFactory的工厂方法直接返回了null,说明并未使用任何的重试策略机制。
    可见,在不引入spring-retry的情况下,是不会让重试策略生效的。

    为Zuul配置请求重试的方式,与Ribbon完全一致。



    作者:吴俊达
    链接:http://www.jianshu.com/p/cb69bb385d24
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    展开全文
  • 参考文章 http://blog.csdn.net/qq_18675693/article/details/53282031
    参考文章   http://blog.csdn.net/qq_18675693/article/details/53282031  
    展开全文
  • 在 基于 " sringcloud(十四)、ribbon负载均衡策略应用案例 "所有工程的基础上,进行如下操作进行网关设置 1、创建eureka-client-consumer-zuul 工程 2、在创建的时候引入如下依赖 3.编写项目的pom.xml ...
  • SpringCloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、负载均衡、微代理、事件总线、全局锁、决策竞选... 请求统一通过 API 网关 Zuul 来访问内部服务,先经过 Token...
  • USE ZUUL: table: eureka-server,pom.xml: spring: application: name: eureka-server #指定应用名字 server: port: 8761 eureka: client: register-with-eureka: false fetch-registry: ...
  • 本文不适合没有SpringCloud基础的人学习。 本编文章,是我学习SpringCloud之后自己整理的一个架子。主要用于自己学习 1、创建父工程 1-1:创建项目 1-2:添加pom依赖 ...xml version="1.0" encoding="UTF-8"?...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,957
精华内容 1,182
关键字:

ribbonzuul