SpringCloud

技术栈

服务注册与发现

EUREKA(停更),Zookeeper,Consul,Nocos

服务调用

RIBBON(NETFLIX网飞), LoadBalancer, FELGN(停更) , OpenFeign

服务熔断降级

HYSTRIX (不推荐) ,resilience4j (国外推荐) ,sentienl (国内推荐)

服务网关

ZUUL (不推荐) , gateWay

服务分布配置

SpringCloud Config (不推荐) , Nocos

服务总线

Bus (不推荐) , Nocos


Ribbon

是什么?

客户端的负载均衡和服务调用工具

能干什么?

负载均衡+RestTemplate

LB负载均衡?

Load Balance – 将用户的请求平摊分配到多个服务上,从而到达系统的HA(高可用)

Ribbon与Nginx的区别?

Ribbon :本地的负载均衡 --在调用微服务接口时,会在注册中心获取注册信息服务列表,存到Jvm,从而在本地实现PRC
Nginx : 服务器的负载均衡 --客户端的所有请求都会交给nginx ,然后再转发到不同的服务器

RestTemplate

RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接, 我们只需要传入url及返回值类型即可

RestTemplate

Ribbon的负载均衡

@LoadBalanced //负载均衡
默认 轮询算法

pom.xml

ApplicationConfiguration

@Configuration
public class ApplicationConfiguration {@Bean@LoadBalanced //负载均衡public RestTemplate restTemplate(){return new RestTemplate();}
}

IRule

如何替换IRule

编写配置类

注意不能在==@ComponentScan== 注解能扫描的地方定义配置

package com.wu.myRule;import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.RoundRobinRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;/*** @program: IClould2020Wu* @author: Mr-Jies* @create: 2020-05-16 10:54**/@Configuration
public class MySelfRule {@Beanpublic IRule iRule(){//定义为随机return new RandomRule();}
}

控制层

package com.wu.icloud.controller;@RestController
public class OrderController {@GetMapping(value = "/consumer/payment1/get/{id}")public CommonResult getPaymentById2(@PathVariable("id") Long id) {ResponseEntity<CommonResult> forEntity = restTemplate.getForEntity(URL_PATH + "/payment/get/" + id, CommonResult.class);if (forEntity.getStatusCode().is2xxSuccessful()){CommonResult body = forEntity.getBody();return body;}return new CommonResult(444,"error");}}

主启动

@EnableEurekaClient
@SpringBootApplication
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)
public class OrderMain80 {public static void main(String[] args) {SpringApplication.run(OrderMain80.class);}
}

手写轮询算法

学完juc再回头写


OpenFeign

是什么?

声明式的web服务客户端,只需创建一个接口并在注解上添加注解即可做到服务调用

能干什么?

使编写Java HTTP客户端变的简单 在使用Ribbon+ RestTemplate时, 利用RestTemplate对http请求的封装处理, 形成了一套模版化的调用方法。在Feign的实现下我们只需创建一个接口并使用注解的方式来配置它(以前是Dao接口上面标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解即可),(方便了)

Feign集成了Ribbon

利用Ribbon维护了Payment的服务列表信息,并且通过轮询实现了客户端的负载均衡。而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用

简单使用

@EnableFeignClients
@FeignClient(name = “CLOUD-PAYMENT-SERVICE”)

pom.xml

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

application.yml

server:port: 80
spring:application:name: cloud-order-serviceeureka:client:register-with-eureka: truefetchRegistry: trueservice-url:defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  # 集群版

主启动

@EnableFeignClients

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

Service

通过接口与服务端映射
@FeignClient(name = “CLOUD-PAYMENT-SERVICE”)

@Component
@FeignClient(name = "CLOUD-PAYMENT-SERVICE")
public interface OpenfeignPaymentService {@GetMapping(value = "/payment/get/{id}")public CommonResult getPaymentById(@PathVariable("id") Long id);@GetMapping("/payment/timeout")public String timeout();
}

Controller

直接调用service就行了,不需要自己再用RestTempate请求

@RestController
@Slf4j
public class OpenFeignOrder80Controller {@Autowiredprivate OpenfeignPaymentService openfeignPaymentService;@GetMapping(value = "/consumer/payment/get/{id}")public CommonResult getPaymentById(@PathVariable("id") Long id) {return openfeignPaymentService.getPaymentById(id);}@GetMapping("/consumer/payment/timeout")public String timeout(){return openfeignPaymentService.timeout();}
}

OpenFeign超时控制


OpenFeign客户端只等待一秒,如果服务端处理需要超过一秒,导致客户端不想等待,直接返回报错

解决

openFeign是ribbon的集成

ribbon:# 指的是建立连接所用的时间,适用于网络状态正常的情况下,两端连接所用的时间ReadTimeout: 5000# 指的是建立连接后从服务器读取到可用资源所用的时间ConnectTimeout: 5000

OpenFeign日志打印

Config

@Configuration
public class FeignConfig {@Beanpublic Logger.Level feignLogger(){return Logger.Level.FULL;}
}

yml

logging:level:com.wu.scf.service.OpenfeignPaymentService: debug

SpringCloud(2)--服务调用相关推荐

  1. springcloud feign 服务调用其他服务_微服务实战——SpringCloud与Feign集成

    上一篇集成了ZuulGateway和Eureka并进行了测试.在实际场景中,我们肯定会有很多的微服务,而他们之间可能会存在相互调用的关系,那么,如何优雅的处理服务之间的调用问题呢?接下来就是我们要解决 ...

  2. SpringCloud OpenFeign服务调用客户端介绍及配置使用

    一.OpenFeign介绍 OpenFeign是Netfix开发的一款声明式,模板化的Http服务调用客户端.使用在服务调用者工程端.OpenFeign的负载均衡也为客户端负载均衡.一下简称Feign ...

  3. SpringCloud OpenFeign 服务调用传递 token

    业务场景 通常微服务对于用户认证信息解析有两种方案 在 gateway 就解析用户的 token 然后路由的时候把 userId 等相关信息添加到 header 中传递下去. 在 gateway 直接 ...

  4. springcloud feign 服务调用其他服务_springCloud微服务项目 构建公共的feign调用

    在微服务项目中加入有一个微服务的接口,很多其他的微服务都需要调用它,那么我们可以写在公共的项目中,而不需要每个微服务都建立一个相应 的feign 1.先在common 公共项目中建一个公共feign调 ...

  5. 【SpringCloud】服务调用OpenFeign

    文章目录 1.概述 1.1 Feign能干什么 1.2 open feign和feign区别 2. 案例 2.1 案例1 2.1.1 consumer端 2.1.1.1 maven 2.1.1.1 主 ...

  6. SpringCloud Feign声明式服务调用

    SpringCloud Feign声明式服务调用 1. 加入pom依赖 2. Application.java上声明@EnableFeignClients 3. @FeignClient声明接口调用服 ...

  7. centos7 搭建本地git_本地服务调用K8S环境中的SpringCloud微服务实战

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:原创文章分类汇总及配套源码,涉及Java.Docker.K8S.Devops等 下图是典型的微 ...

  8. SpringCloud实战5-Feign声明式服务调用

    SpringCloud实战5-Feign声明式服务调用 在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还 ...

  9. SpringCloud OpenFeign 远程HTTP服务调用用法与原理

    在 openFeign 未出现前,Spring 提供了 RestTemplate 作为远程服务调用的客户端,提供了多种便捷访问远程 Http 服务的方法,能够大大提高客户端的编写效率.由于文章内容会使 ...

最新文章

  1. [Unity3D]Unity3D连衣裙实现游戏开发系统
  2. 【腾讯面试题】熊出没
  3. Keil工程Lib库文件的制作和运用
  4. 《HTML5 canvas开发详解(第2版)》——1.3 本书使用的基础HTML页面
  5. MySQL高级 - 案例 - 系统性能优化 - 读写分离概述
  6. 一个障碍,就是一个超越自我的契机
  7. 计算机显示器工作原理与维修,新型电脑显示器的原理与维修
  8. 724A - CAN总线
  9. [ERROR] InnoDB: ibdata1 different size (rounded down to MB)
  10. C 标准库 —— time.h
  11. Java中12 种 Spring 常用注解,必须记住!
  12. C++基础:第六章 语句
  13. 【openGauss】gsql客户端工具(二)gsql客户端工具之Data Studio客户端工具
  14. 一款用C++语言实现的3D游戏引擎(附源码),适用于想学3D游戏开发
  15. 网页显示无法解析服务器DNS地址,打开windows7系统下网页提示无法解析服务器的DNS地址怎么办...
  16. java 仙剑奇侠传_仙剑奇侠传-繁体版
  17. 网吧流媒体服务器系统,网吧视频点播服务器架设完全攻略流媒体服务器 -电脑资料...
  18. PerfDog常见问题解决
  19. 基于FFMPEG采集摄像头图像编码MP4视频+时间水印
  20. 苹果和老降噪芯片合作商分手: iPhone 5 Siri 有变?

热门文章

  1. mysql-索引分析
  2. 【JavaSE】十二生肖带你走进枚举类
  3. c语言 整数拆分,C++ 整数拆分方法详解
  4. 开机输入用户名密码时弹出被调用对象已与其客户端断开连接解决方法
  5. 文本处理三剑客与正则表达式详解
  6. 从1到无穷大—机器学习篇
  7. Eigen学习记录1-Affine3f 仿射变换矩阵
  8. 图文解析|cad如何卸载干净重装?要用cad的同志点进来学习
  9. IE浏览器如何获取本地ip地址
  10. SIMCOM 常用AT指令