微服务-服务调用(Ribbon)

文章目录
微服务-服务调用
地址硬编码

  • 1.服务调用

Ribbon

  • 1.服务调用
  • 2.负载均衡
  • 3.请求重试

OpenFeign

  • 1.服务调用
  • 2.负载均衡
  • 3.服务降级
  • 4.请求压缩
  • 5.日志配置
  • 6.自定义Feign

微服务-服务调用
服务调用,即一个服务调用另一个服务,此过程可以分为服务调用者、服务提供者。基本上都会使用注册中心来作为中间件。

地址硬编码
地址硬编码即将微服务的IP、端口号、请求url等具体的api地址通过代码的形式写在调用者服务中。

平常的单体应用中,客户端访问应用api即可取得数据;在微服务中,服务调用其它服务的api,就可以获取其数据,这样做的好处在于服务细分化,即将一个服务拆分为很多小服务。


1.服务调用
1.创建两个服务,一个为服务调用者,一个为服务提供者(均可为SpringBoot项目)。
假设服务提供者(即被调用者)的配置如下:

server: 
 port: 9091 #服务端口号

spring:
 application:
   name: img-service #服务名
2.硬编码调用
服务调用者,直接使用http协议进行服务调用,需要用到RestTemplate对象。

@SpringBootApplication
public class MainApplication {

    @Bean//将RestTemplate注册到容器
    public RestTemplate RestTemplate(){
          return new RestTemplate();
    }

    public static void main(String[] args) {
       SpringApplication.run(MainApplication.class,args);
    }

}
一般情况下,控制层方法来处理用户请求,因此在这里进行服务调用:

@Autowired//注入RestTemplate
private RestTemplate rt;

@RequestMapping("/img/{id}")
public Img findimg(@PathVariable long id){//地址硬编码,不方便 ,因此需要服务注册中心
   //调用图片服务(需启动图片服务)
   Img img=rt.getForObject("http://localhost:9092/img/findimg/"+id,Img.class);
   return img;
}
可以发现,硬编码的调用方式简单快捷。但这种调用方式将服务的ip、端口都精准地写在代码中,而且ip和端口往往是最容易变动的。当服务越来越多时,写入的ip、端口就会越来越多,这将使得后期维护变得极为困难。

Ribbon
注册中心Eureka、Consul、甚至接下来的OpenFeign均集成了Ribbon,足以证明了Ribbon的强大。
Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。

1.服务调用
Ribbon依赖:Eureka、Consul均集成了,因此这些依赖实际上已经被导入了,不用手动添加,依赖如下。

<!--Ribbon依赖-->
<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
     <version>2.2.1.RELEASE</version>
</dependency>
调用者启动类将RestTemplate对象注册到容器,并使用注解 @LoadBalanced来实现负载均衡

@LoadBalanced
@Bean//将RestTemplate注册到容器
public RestTemplate RestTemplate(){
   return new RestTemplate();
}
控制层来调用目标服务:

@Autowired//注入RestTemplate
private RestTemplate rt;

//Ribbon获取服务
@RequestMapping("/img3/{id}")
public Img ribbonimg(@PathVariable long id){
   Img img=rt.getForObject("http://img-service/img/findimg/"+id,Img.class);//服务名
   return img;
}
整个调用过程就是这么简单,当然前提是你已经使用了注册中心。

2.负载均衡
不同配置的主机部署相同的服务时,可能会承受的压力是等效的,但由于主机配置不同,导致出现配置低的主机承受不了,配置高的主机绰绰有余,因此可以为配置高的主机多分摊一些压力,达到负载均衡。即对多个相同功能的微服务,实现平衡调用。

负载均衡分服务端负载均衡和客户端负载均衡:

服务端:nginx、F5等
客户端:Ribbon
负载均衡的开启:在注册RestTemplate到容器时,添加注解 @LoadBalanced就开启了。

Ribbon提供了负载均衡策略,如果一般情况下不建议修改,除非一样的服务,部署在不同配置的主机上。

修改服务调用者的负载均衡策略:

#修改Ribbon负载均衡策略:服务名.ribbon.NFLoadBalancerRuleClassName.策略
img-service:
 ribbon:
   NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
3.请求重试
当服务调用者调用一个服务时,被调用的服务可能无法响应(宕机),此时调用者无法进行对其调用,那么可以重试请求去调用另一个相同的服务。

为调用者服务配置请求重试:

<!--spring 重试组件-->
<dependency>
   <groupId>org.springframework.retry</groupId>
   <artifactId>spring-retry</artifactId>
</dependency>
添加配置

spring:
    cloud:
        loadbalancer:
            retry:
                enabled: true #开启springCloud的重试功能,默认开启
img-service:
    ribbon:
        ConnectTimeout: 250           #ribbon连接的超时时间
        ReadTimeout: 1000             #ribbon数据读取的超时时间
        OkToRetryOnAllperations: true #是否对所有操作都重试
        MaxAutoRetriesNextServer: 1   #切换实例的重试次数
        MaxAutoRetries: 1             #当前实例的重试次数
OpenFeign
SpringCloud对feign组件进行了增强,使其支持SpringMVC注解、整合了Ribbon和Eureka。

1.服务调用
openfeign的调用写法和前面几种略有不同,但这种方式即简单又高效,是十分值得使用的方式。

引入依赖:

<!--SpringCloud整合的openFeign-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<!--引入EurekaClient-->
<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在调用者的启动类使用注解 @EnableOpenFeign注解激活OpenFeign

@SpringBootApplication
@EnableFeignClients//激活Fegin,注意写在配置类上会启动出错
public class MainApplication {
   
    public static void main(String[] args) {
       SpringApplication.run(MainApplication.class,args);
   }
}
为调用者创建接口,并在接口上通过注解调用服务:

@Component
@FeignClient(name="img-service")    //声明要调用的微服务名,name值为服务名
public interface ImgFeignClient {

   // 配置需要调用的微服务接口
   @RequestMapping(value = "/img/findimg/{id}",method = RequestMethod.GET)    
   public Img findid( @PathVariable long id);
   
}
调用者控制层调用接口,实现对数据的获取:

@Autowired
private ImgFeignClient ifc;    //此处报红线,不用担心,是加载过慢

//feign获取服务
@RequestMapping("/img4/{id}")
public Img fignimg(@PathVariable long id){
   Img img=ifc.findid(id);
   return img;
}
可以看出,这种方式是最舒服的,使得调用和控制层耦合度变低。而且不需要再注册 RestTemplate 对象(就算注册了,也会失效)。

2.负载均衡
Feign 中本身已经集成了Ribbon依赖和自动配置,因此我们不需要额外引入依赖.也不需要额外配置。

3.服务降级
什么是服务降级?即服务请求已经达到上设置的上限(阀值)时,为后面的请求提供一个低级的服务来处理请求,以此来解决高并发问题。

OpenFeign内部集成了Hystrix,通过Hystrix,可以实现服务的降级操作。服务降级的解决方案不止Hystrix一种:https://blog.csdn.net/qq_52681418/article/details/113351447

Feign的调用方式为在调用者添加接口,对接口使用注解来实现服务调用,然后在控制层调用接口。这和一般的调用相比多了一层接口,因此在feign里,可以对调用的服务接口设置降级。

Feign已经集成了Hystrix,因此无需再导入依赖,只需要添加配置:

feign:
    hystrix: #开启对hystrix的支持
        enabled: true
实现要保护的接口,并将实现类注册到容器:假定调用服务创建的接口为ImgFeignClient 。

@Component
public class ImgFeignClientCallBack implements ImgFeignClient {
  
   @Override // 熔断降级的方法
   public Img findid(long id) {
       Img img=new Img();
       img.setName("触发降级方法");
       return img;
   }
}
调用服务的接口上添加注解,指定用来降级的实现类(因为此接口实现不止一个):

//  fallback:指定服务降级方法,即实现类
@FeignClient(name="img-service",fallback= ImgFeignClientCallBack.class)
public interface ImgFeignClient {
   
    // 配置需要调用的微服务接口
   @RequestMapping(value = "/img/findimg/{id}",method = RequestMethod.GET)
   public Img findid( @PathVariable long id);
   
}
为什么说此接口实现类不止一个呢,通过接口加注解来调用服务,不就相当于内置提供了一个实现吗。

4.请求压缩
SpringCloud Feign支持对请求、响应进行GZIP压缩,减少性能损耗。

为调用者添加如下配置:

feign:
    compression:
        request:
            enabled: true #开启请求压缩
        response:
            enabled: true #开启响应压缩
同时,可以对请求的数据类型、触发压缩的大小下限。

feign:
    compression:
        request:
            enabled: true #开启请求压缩
            mime-types: text/html,application/xml,application/json    #设置压缩的数据类型
            min-request-size: 2048 #设置触发压缩的大小下限
上面均为默认配置,无特殊需求,可以不写。

5.日志配置
为调用者添加日志配置:

feign:
client:
 config:
    img-service: #此处为服务名
        loggerLevel: FULL 
                #NONE:不输出日志(性能最好)。
                #BASIC:适用于生产环境追踪问题
                #HEADERS:在BASIC的基础上记录请求和响应头信息
                #FULL:记录所有
logging:
    level:
        com.feign.ImgFeignClient: debug1    #接口全类名
6.自定义Feign
从Spring Cloud Edgware开始,Feign支持使用属性自定义Feign.

feign:
   client:
     config:
       feignName: ##定义FeginClient的名称
         connectTimeout: 5000  # 相当于Request.Options
         readTimeout: 5000   # 相当于Request.Options
         # 配置Feign的日志级别,相当于代码配置方式中的Logger
         loggerLevel: full
         # Feign的错误解码器,相当于代码配置方式中的ErrorDecoder
         errorDecoder: com.example.SimpleErrorDecoder
         # 配置重试,相当于代码配置方式中的Retryer
         retryer: com.example.SimpleRetryer
         # 配置拦截器,相当于代码配置方式中的RequestInterceptor
         requestInterceptors:
           - com.example.FooRequestInterceptor
           - com.example.BarRequestInterceptor
         decode404: false
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lamp-cloud的前身是zuihou-admin-cloud,从3.0.0版本开始,改名为lamp-cloud,它是lamp项目的其中一员。   lamp-cloud是一个基于SpringCloud(Hoxton.SR10) + SpringBoot(2.3.10.RELEASE)的SaaS微服务脚手架,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关API、分布式事务、大文件断点分片续传等多个模块,支持多业务系统并行开发,可以作为后端服务的开发脚手架。代码简洁,架构清晰,适合学习和直接项目中使用。核心技术采用Nacos、Fegin、Ribbon、Zuul、Hystrix、JWT Token、Mybatis、SpringBoot、Redis、RibbitMQ等主要框架和中间件。 lamp-cloud功能: 1、服务注册&发现与调用: 基于Nacos来实现的服务注册与发现,使用使用Feign来实现服务互调, 可以做到使用HTTP请求远程调用时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。 2、服务鉴权: 通过JWT的方式来加强服务之间调度的权限验证,保证内部服务的安全性。 3、负载均衡: 将服务保留的rest进行代理和网关控制,除了平常经常使用的node.js、nginx外,Spring Cloud系列的zuul和ribbon,可以帮我们进行正常的网关管控和负载均衡。其中扩展和借鉴国外项目的扩展基于JWT的Zuul限流插件,方面进行限流。 4、熔断机制: 因为采取了服务的分布,为了避免服务之间的调用“雪崩”,采用了Hystrix的作为熔断器,避免了服务之间的“雪崩”。 5、监控: 利用Spring Boot Admin 来监控各个独立Service的运行状态;利用turbine来实时查看接口的运行状态和调用频率;通过Zipkin来查看各个服务之间的调用链等。 6、链路调用监控: 利用Zipkin实现微服务的全链路性能监控, 从整体维度到局部维度展示各项指标,将跨应用的所有调用链性能信息集中展现,可方便度量整体和局部性能,并且方便找到故障产生的源头,生产上可极大缩短故障排除时间。有了它,我们能做到: 请求链路追踪,故障快速定位:可以通过调用链结合业务日志快速定位错误信息。 可视化:各个阶段耗时,进行性能分析。 依赖优化:各个调用环节的可用性、梳理服务依赖关系以及优化。 数据分析,优化链路:可以得到用户的行为路径,汇总分析应用在很多业务场景。 7、数据权限 利用基于Mybatis的DataScopeInterceptor拦截器实现了简单的数据权限 8、SaaS(多租户)的无感解决方案 使用Mybatis拦截器实现对所有SQL的拦截,修改默认的Schema,从而实现多租户数据隔离的目的。 并且支持可插拔。 9、二级缓存 采用J2Cache操作缓存,第一级缓存使用内存(Caffeine),第二级缓存使用 Redis。 由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目标是降低对 L2 的读取次数。 该缓存框架主要用于集群环境中。单机也可使用,用于避免应用重启导致的缓存冷启动后对后端业务的冲击。 10、优雅的Bean转换 采用Dozer组件来对 DTO、DO、PO等对象的优化转换 11、前后端统一表单验证 严谨的表单验证通常需要 前端+后端同时验证, 但传统的项目,均只能前后端各做一次检验, 后期规则变更,又得前后端同时修改。 故在hibernate-validator的基础上封装了zuihou-validator-starter起步依赖,提供一个通用接口,可以获取需要校验表单的规则,然后前端使用后端返回的规则, 以后若规则改变,只需要后端修改即可。 12、防跨站脚本攻击(XSS) 通过过滤器对所有请求中的 表单参数 进行过滤 通过Json反序列化器实现对所有 application/json 类型的参数 进行过滤 13、当前登录用户信息注入器 通过注解实现用户身份注入 14、在线API 由于原生swagger-ui某些功能支持不够友好,故采用了国内开源的swagger-bootstrap-ui,并制作了stater,方便springboot用户使用。 15、代码生成器 基于Mybatis-plus-generator自定义了一套代码生成器, 通过配置数据库字段的注释,自动生成枚举类、数据字典注解、SaveDTO、UpdateDTO、表单验证规则注解、Swagger注解等。 16、定时任务调度器: 基于xxl-jobs进行了功能增强。(如:指定时间发送任务、执行器和调度器合并项目、多数据源) 17、大文件/断点/分片续传 前端采用w
### 回答1: B的Spring Cloud微服务之间可以通过各种方式进行调用,如RESTful API、HTTP客户端、辅助库等方式。其中,RESTful API是最常见的方式,通过HTTP协议进行通信,服务A在请求服务B时,将需要的参数放在请求的URL或请求体中,服务B将依据请求参数做出响应。而HTTP客户端则是通过指定服务B的URL地址和端口号进行调用。最后,辅助库则是指具有特定功能的第三方库,如Feign、Ribbon等,它们能够简化微服务调用过程,提高开发效率。 ### 回答2: Spring Cloud是基于Spring Framework的一组开源框架,通过Spring Cloud可以快速构建微服务应用程序。Spring Cloud提供了一整套微服务架构解决方案,包括服务注册、服务发现、负载均衡、断路器、分布式配置、消息总线、API网关等。在微服务架构中,服务是以微服务的形式分离出去的,因此不同的微服务之间需要进行调用。那么,具体Spring Cloud微服务之间如何进行调用呢? 在Spring Cloud微服务架构中,微服务之间调用主要有两种方式: 1. 使用RestTemplate RestTemplate是Spring提供的一个HTTP客户端库,可以方便地进行HTTP请求。当一个微服务需要调用另一个微服务时,可以使用RestTemplate发起HTTP请求,请求对方的API,然后获取响应值。编写RestTemplate请求的代码如下: ``` RestTemplate restTemplate = new RestTemplate(); String response = restTemplate.getForObject("http://服务名/url", String.class); ``` 其中,服务名指的是需要调用微服务名,url指的是对方微服务提供的API路径。 2. 使用Feign Feign是Spring Cloud提供的另一个HTTP客户端库,用于简化微服务之间的调用。Feign需要通过定义接口的方式来调用远程微服务,其底层封装了RestTemplate,因此使用起来更加方便。具体使用方式如下: 首先,在pom.xml中引入Feign相关依赖: ``` <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> ``` 然后,在启动类上添加@EnableFeignClients注解开启Feign客户端功能: ``` @SpringBootApplication @EnableFeignClients public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 最后,在需要调用远程微服务的接口上添加@FeignClient注解,指定需要调用微服务名和API路径,然后定义接口方法: ``` @FeignClient(name = "service-name") public interface RemoteService { @GetMapping("/api/xxx") String callRemoteService(); } ``` 其中,name指的是需要调用微服务名,/api/xxx指的是对方微服务提供的API路径。 以上就是Spring Cloud微服务之间调用的基本方式,可以根据实际业务需求进行选择。总的来说,使用RestTemplate适合于简单的HTTP请求场景,适用于较小的微服务架构;而使用Feign适合于复杂场景下的微服务调用,适用于大型的微服务架构。 ### 回答3: SpringCloud是一种流行的微服务框架,是建立在SpringBoot之上的。它的主要目标是帮助开发者快速构建微服务应用程序,并通过各种机制实现微服务应用程序的管理和部署。关于SpringCloud中微服务之间的调用,下面是我对此的详细解释。 SpringCloud微服务之间的调用可以通过RESTful API或RPC方式实现。在RESTful API方案中,服务之间是通过HTTP请求来进行通信的,而在RPC时代,服务之间可以通过各种协议(比如gRPC、Dubbo等)进行通信。 第一种方法是RESTful API,即基于http协议的服务交互方式。在这种架构中,每个服务都提供自己的RESTful API接口,并可以通过HTTP协议来调用其它服务的接口。这种架构的优点是简洁明了、易于实现、可移植性强,缺点是性能相对较低、并发量较低、传输数据量较大。 第二种方法是RPC(Remote Procedure Call),即远程过程调用。在此模式下,各个微服务之间不直接访问对方的API接口,而是通过引入一个中间件来完成服务之间的调用。比如Dubbo框架就是一种类型的RPC框架。这种方式的优点是效率高、并发性好、传输数据量小,但缺点是实现难度相对较大。 总的来说,两种调用方式都有各自的优劣点,具体可以根据项目需求情况来进行选择。无论选择哪种方式,都需要遵循微服务架构中的服务治理原则,例如通过注册中心来维护服务发现,通过负载均衡来保证服务的高可用性等,这些都是完成微服务架构中调用需要注意的核心问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值