欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Spring cloud学习一,

来源: javaer 分享于  点击 46915 次 点评:58

Spring cloud学习一,


SpringCLoud

总览

123

img

服务注册/发现&注册中心

1、Eureka

服务注册(服务提供者)/发现(服务调用者)&注册中心(服务中介)

1588323712955

  • 服务注册:

    Eureka 客户端向 Eureka Server 注册时,它提供自身的元数据,比如IP地址、端口,运行状况指示符URL,主页等。

  • 服务续约:

    Eureka 客户会每隔30秒(默认情况下)发送一次心跳来续约。通过续约来告知 Eureka ServerEureka 客户仍然存在,没有出现问题。正常情况下,如果 Eureka Server 在90秒没有收到 Eureka 客户的续约,它会将实例从其注册表中删除。

  • 服务下线

    Eureka客户端在程序关闭时向Eureka服务器发送取消请求。发送请求后,该客户端实例信息将从服务器的实例注册表中删除。该下线请求不会自动完成,它需要调用以下内容:DiscoveryManager.getInstance().shutdownComponent();

  • 服务剔除

    在默认的情况下,当Eureka客户端连续90秒(3个续约周期)没有向Eureka服务器发送服务续约,即心跳,Eureka服务器会将该服务实例从服务注册列表删除,即服务剔除。

  • 获取注册列表信息 Fetch Registries

    Eureka 客户端从服务器获取注册表信息,并将其缓存在本地 。 该注册列表信息定期(每30秒钟)更新一次。 在默认的情况下 Eureka 客户端使用压缩 JSON 格式来获取注册列表的信息。

  • 架构图

    img

  • 步骤

    • 注册中心

    • 客户端

2、Consul

3、Zookeeper


服务接口调用

OpenFeign

OpenFeign 直接内置了 Ribbon。

RestTemplateSpring提供的一个访问Http服务的客户端类 。例如以下例子,我们就能通过/judge路径访问到http://localhost:8081//service1

@Autowired
private RestTemplate restTemplate;
// 这里是提供者A的ip地址,但是如果使用了 Eureka 那么就应该是提供者A的名称
privatestaticfinal String SERVICE_PROVIDER_A = "http://localhost:8081";

@PostMapping("/judge")
public boolean judge(@RequestBody Request request) {
    String url = SERVICE_PROVIDER_A + "/service1";
    return restTemplate.postForObject(url, request, Boolean.class);
}

使用有些麻烦。OpenFeign能做到向 域名和IP地址的映射一样进行服务间的调用

  • 实现

    • 消费端
    • 提供端

      实现@FeignClient注解标注类的路径映射即可


负载均衡

Ribbon(蝴蝶结)

它是在消费者端进行的负载均衡 。

  • RoundRobinRule:轮询策略。Ribbon默认采用的策略。若经过一轮轮询没有找到可用的provider,其最多轮询 10 轮。若最终还没有找到,则返回 null。(默认
  • RandomRule: 随机策略,从所有可用的 provider 中随机选择一个。
  • RetryRule: 重试策略。先按照 RoundRobinRule 策略获取 provider,若获取失败,则在指定的时限内重试。默认的时限为 500 毫秒。

实现:

自定义负载均衡算法


服务熔断降级

Hystrix(豪猪兽)

Hystrix是一个库,可通过添加等待时间容限和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,停止服务之间的级联故障并提供后备选项来实现此目的,所有这些都可以提高系统的整体弹性。

在微服务场景中,通常会有很多层的服务调用。如果一个底层服务出现问题,故障会被向上传播给用户。我们需要一种机制,当底层服务不可用时,可以阻断故障的传播。这就是断路器的作用。他是系统服务稳定性的最后一重保障。

在springcloud中断路器组件就是Hystrix。Hystrix也是Netflix套件的一部分。他的功能是,当对某个服务的调用在一定的时间内(默认10000ms),有超过一定次数(默认20次)并且失败率超过一定值(默认50%),(更多详情见HystrixCommandProperties类),该服务的断路器会打开。返回一个由开发者设定的fallback。

fallback可以是另一个由Hystrix保护的服务调用,也可以是固定的值。fallback也可以设计成链式调用,先执行某些逻辑,再返回fallback。

Hystrix的作用

1、服务降级

情景:

实现:

  • 改善

    在调用端controller类上加上@DefaultProperties注解,指定整个类的全局降级处理方法

    @RestController
    @DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
    public class OrderOpenFeignController {
    
        @Resource
        PaymentService paymentService;
    
        @Resource
        PaymentHystrixService paymentHystrixService;
    
        @GetMapping("/consumer/payment/get/{id}")
        public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
            return paymentService.getPaymentByid(id);
        }
    
        @GetMapping("/consumer/payment/hystrix/ok/{id}")
        public String paymentInfo_OK(@PathVariable("id") Integer id)
        {
            String result = paymentHystrixService.paymentInfo_OK(id);
            System.out.println("*****result: "+result);
            return result;
        }
    
        @GetMapping("/consumer/payment/hystrix/timeout/{id}")
       /* @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {
                @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")
        })*/
        //使用全局处理之后写下面的注解,不加属性代表使用默认的全局处理方法
        @HystrixCommand
        public String paymentInfo_TimeOut(@PathVariable("id") Integer id)
        {
            String result = paymentHystrixService.paymentInfo_TimeOut(id);
            System.out.println("*****result: "+result);
            return result;
        }
    
        public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id){
            return "timeout";
        }
    
        // 下面是全局fallback方法
        public String payment_Global_FallbackMethod()
        {
            return "Global异常处理信息,请稍后再试,/(ㄒoㄒ)/~~";
        }
    
    }
    
  • 2、服务熔断

    类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示 。

    服务的降级->进而熔断->恢复调用链路

    实现:

    3、服务监控

    实现:

    1588410050258

    1588410010293

    注意:每个颜色的数字对应右上方每个属性,例如,绿色代表成功次数。

    服务网关

    • 网关职责:

        	<img src="https://gitee.com/jklixin/images/raw/master/cloud/aHR0cDovL2Nvcy5yYWluMTAyNC5jb20vbWFya2Rvd24vaW1hZ2UtMjAxOTEwMDgxNjAzMjUwMjEucG5n.jpg" alt="img" style="zoom: 50%;" /> 
      
    • 网关分类与功能:

      img

    1、Gateway

    为微服务架构提供一种简单而有效的统一的API路由管理方式

    img

    1589353262774

    • 实现

    路由转发

    
    

    Filter

    下例中表示当含有uname属性是允许访问。

    @Component
    public class FilterConfig implements GlobalFilter,Ordered{
    
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            System.out.println("进入过滤器");
            String uname=exchange.getRequest().getQueryParams().getFirst("uname");
            if(uname==null){
                //请求路径中没有该属性值
                System.out.println("拒绝访问");
                exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
                return exchange.getResponse().setComplete();
            }
            //存在,放行
            return chain.filter(exchange);
        }
    
        @Override
        public int getOrder() {
            return 0;
        }
    }
    
    

    测试: http://localhost:9527/payment/lb?uname=z3 访问成功

    服务配置中心

    为分布式系统中的外部配置提供服务器和客户端支持。方便部署与运维。有客户端、服务端。

    服务端也称分布式配置中心,是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。

    客户端则是通过指定配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。默认采用 git,并且可以通过 git 客户端工具来方便管理和访问配置内容。

    优点:

    • 集中管理配置文件
    • 不同环境不同配置,动态化的配置更新
    • 运行期间,不需要去服务器修改配置文件,服务会想配置中心拉取自己的信息
    • 配置信息改变时,不需要重启即可更新配置信息到服务
    • 配置信息以 rest 接口暴露

    实现:

  • 客户端

  • 访问方式:

    /{application}/{profile}[/{label}]
    /{application}-{profile}.yml
    /{label}/{application}-{profile}.yml
    /{application}-{profile}.properties
    /{label}/{application}-{profile}.properties

    1588476129348

    1588476151356

    问题: 更改gitee上的内容,服务端更新成功,但是客户端并未更新成功

    动态刷新

    解决:

    问题: 多个客户端如何实现动态刷新


    消息总线

    Bus

    Bus支持两种消息代理:RabbitMQ和Kafka

    广播

    实现

    • 服务端

    • 客户端

    测试:

    定点通知

    实现: 公式:http://localhost:3344/actutor/bus-refresh/{destination}

    测试: curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"

    ​ http://localhost:3355/configInfo 一致

    ​ http://localhost:3366/configInfo 不一致


    消息驱动

    Stream

    屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型

    相关文章

      暂无相关文章
    相关栏目:

    用户点评