SpringCloud(2)--服务调用
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)--服务调用相关推荐
- springcloud feign 服务调用其他服务_微服务实战——SpringCloud与Feign集成
上一篇集成了ZuulGateway和Eureka并进行了测试.在实际场景中,我们肯定会有很多的微服务,而他们之间可能会存在相互调用的关系,那么,如何优雅的处理服务之间的调用问题呢?接下来就是我们要解决 ...
- SpringCloud OpenFeign服务调用客户端介绍及配置使用
一.OpenFeign介绍 OpenFeign是Netfix开发的一款声明式,模板化的Http服务调用客户端.使用在服务调用者工程端.OpenFeign的负载均衡也为客户端负载均衡.一下简称Feign ...
- SpringCloud OpenFeign 服务调用传递 token
业务场景 通常微服务对于用户认证信息解析有两种方案 在 gateway 就解析用户的 token 然后路由的时候把 userId 等相关信息添加到 header 中传递下去. 在 gateway 直接 ...
- springcloud feign 服务调用其他服务_springCloud微服务项目 构建公共的feign调用
在微服务项目中加入有一个微服务的接口,很多其他的微服务都需要调用它,那么我们可以写在公共的项目中,而不需要每个微服务都建立一个相应 的feign 1.先在common 公共项目中建一个公共feign调 ...
- 【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 主 ...
- SpringCloud Feign声明式服务调用
SpringCloud Feign声明式服务调用 1. 加入pom依赖 2. Application.java上声明@EnableFeignClients 3. @FeignClient声明接口调用服 ...
- centos7 搭建本地git_本地服务调用K8S环境中的SpringCloud微服务实战
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:原创文章分类汇总及配套源码,涉及Java.Docker.K8S.Devops等 下图是典型的微 ...
- SpringCloud实战5-Feign声明式服务调用
SpringCloud实战5-Feign声明式服务调用 在前面的文章中可以发现当我们通过RestTemplate调用其它服务的API时,所需要的参数须在请求的URL中进行拼接,如果参数少的话或许我们还 ...
- SpringCloud OpenFeign 远程HTTP服务调用用法与原理
在 openFeign 未出现前,Spring 提供了 RestTemplate 作为远程服务调用的客户端,提供了多种便捷访问远程 Http 服务的方法,能够大大提高客户端的编写效率.由于文章内容会使 ...
最新文章
- [Unity3D]Unity3D连衣裙实现游戏开发系统
- 【腾讯面试题】熊出没
- Keil工程Lib库文件的制作和运用
- 《HTML5 canvas开发详解(第2版)》——1.3 本书使用的基础HTML页面
- MySQL高级 - 案例 - 系统性能优化 - 读写分离概述
- 一个障碍,就是一个超越自我的契机
- 计算机显示器工作原理与维修,新型电脑显示器的原理与维修
- 724A - CAN总线
- [ERROR] InnoDB: ibdata1 different size (rounded down to MB)
- C 标准库 —— time.h
- Java中12 种 Spring 常用注解,必须记住!
- C++基础:第六章 语句
- 【openGauss】gsql客户端工具(二)gsql客户端工具之Data Studio客户端工具
- 一款用C++语言实现的3D游戏引擎(附源码),适用于想学3D游戏开发
- 网页显示无法解析服务器DNS地址,打开windows7系统下网页提示无法解析服务器的DNS地址怎么办...
- java 仙剑奇侠传_仙剑奇侠传-繁体版
- 网吧流媒体服务器系统,网吧视频点播服务器架设完全攻略流媒体服务器 -电脑资料...
- PerfDog常见问题解决
- 基于FFMPEG采集摄像头图像编码MP4视频+时间水印
- 苹果和老降噪芯片合作商分手: iPhone 5 Siri 有变?