SpringCloud02

1.在项目中,服务之间的调用是怎么实现的?

  1. 1.1基于RestTemplate和@LoadBalanced注解

    • RestTemplate是Spring提供的用于访问RESTful服务的客户端。
    • 添加@LoadBalanced注解后,RestTemplate会成为一个负载均衡的HTTP客户端,它可以自动从服务注册中心(如Eureka、Zookeeper等)获取服务实例列表,并根据负载均衡策略选择一个实例进行调用。
    • 使用时,可以直接通过RestTemplate的模板方法来发送HTTP请求,服务调用代码对调用细节相对不透明。
  2. 1.2基于DiscoveryClient

    • DiscoveryClient是Spring Cloud提供的服务发现接口,可以获取注册到服务注册中心的所有服务实例信息。
    • 通过DiscoveryClient,应用程序可以手动选择服务实例并直接使用其URL进行调用。
    • 这种方式相比RestTemplate更加灵活,但需要更多的手动编码。
  3. 1.3基于Feign的声明式调用

    • Feign是一个声明式的伪HTTP客户端,它使得编写Web服务客户端变得更加简单。
    • 使用Feign时,开发者可以通过定义一个接口并添加Feign的注解来描述HTTP请求的细节(如URL、HTTP方法、参数等)。
    • Spring Cloud集成了Feign,可以通过@EnableFeignClients注解开启对Feign的支持。
    • Feign内部同样使用了LoadBalancerClient实现负载均衡,因此服务调用也会从服务注册中心获取可用的服务实例。

2.feign和openFeign的区别

2.1 什么是Feign

Netflix Feign 是 Netflix 公司发布的一种实现负载均衡和服务调用的开源组件。Spring Cloud 将其与 Netflix 中的其他开源服务组件(例如 Eureka、Ribbon 以及 Hystrix 等)一起整合进 Spring Cloud Netflix 模块中,整合后全称为 Spring Cloud Netflix FeignFeign 对 Ribbon 进行了集成,利用 Ribbon 维护了一份可用服务清单,并通过 Ribbon 实现了客户端的负载均衡。

Feign 是一种声明式服务调用组件,它在 RestTemplate 的基础上做了进一步的封装。通过 Feign,我们只需要声明一个接口并通过注解进行简单的配置(类似于 Dao 接口上面的 Mapper 注解一样)即可实现对 HTTP 接口的绑定。通过 Feign,我们可以像调用本地方法一样来调用远程服务,而完全感觉不到这是在进行远程调用。

Feign 支持多种注解,例如 Feign 自带的注解以及 JAX-RS 注解等,但遗憾的是 Feign 本身并不支持 Spring MVC 注解,这无疑会给广大 Spring 用户带来不便。

2.2 什么是OpenFeign

2019 年 Netflix 公司宣布 Feign 组件正式进入停更维护状态,于是 Spring 官方便推出了一个名为 OpenFeign 的组件作为 Feign 的替代方案。

OpenFeign 全称 Spring Cloud OpenFeign,它是 Spring 官方推出的一种声明式服务调用与负载均衡组件,它的出现就是为了替代进入停更维护状态的 Feign。

OpenFeign 是 Spring Cloud 对 Feign 的二次封装,它具有 Feign 的所有功能,并在 Feign 的基础上增加了对 Spring MVC 注解的支持,例如 @RequestMapping、@GetMapping 和 @PostMapping 等。

2.3 常用注解

注解说明
@FeignClient该注解用于通知 OpenFeign 组件对 @RequestMapping 注解下的接口进行解析,并通过动态代理的方式产生实现类,实现负载均衡和服务调用。
@EnableFeignClients该注解用于开启 OpenFeign 功能,当 Spring Cloud 应用启动时,OpenFeign 会扫描标有 @FeignClient 注解的接口,生成代理并注册到 Spring 容器中。
@RequestMappingSpring MVC 注解,在 Spring MVC 中使用该注解映射请求,通过它来指定控制器(Controller)可以处理哪些 URL 请求,相当于 Servlet 中 web.xml 的配置。
@GetMappingSpring MVC 注解,用来映射 GET 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.GET) 。
@PostMappingSpring MVC 注解,用来映射 POST 请求,它是一个组合注解,相当于 @RequestMapping(method = RequestMethod.POST) 。

2.4 Feign和OpenFeign的相同点

  1. Feign 和 OpenFeign 都是 Spring Cloud 下的远程调用和负载均衡组件。

  2. Feign 和 OpenFeign 作用一样,都可以实现服务的远程调用和负载均衡。

  3. Feign 和 OpenFeign 都对 Ribbon 进行了集成,都利用 Ribbon 维护了可用服务清单,并通过 Ribbon 实现了客户端的负载均衡。

  4. Feign 和 OpenFeign 都是在服务消费者(客户端)定义服务绑定接口并通过注解的方式进行配置,以实现远程服务的调用。

2.5 Feign和OpenFeign的区别

官方已经宣布停止更新Feign组件,所以可以使用OpenFeign进行代替

FeignOpenFeign
Feign是Spring Cloud组件中的一个轻量级RESTful的HTTP服务客户端Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务,Feign的使用方式是:使用Feign的注解定义接口,调用这个接口就可以调用服务注册中心的服务OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequesMapping等等。 OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务

Feign本身不支持SpringMVC的注解,它有一套自己的注解;

调用方式是通过@RequestLine指定HTTP协议及URL地址

@FeignClient("song-system")
public interface SystemRemoteService {

    @GetMapping("/emp/haha")
    public AjaxResult haha(@RequestParam("id") Integer id);

    @PostMapping("/role/aaa")
    public AjaxResult asd(@RequestBody People people);
}

3.openFeign原理

OpenFeign的原理主要涉及以下几个关键部分:

1. 接口定义与注解
   - 使用OpenFeign时,开发者需要定义一个接口,并在接口的方法上添加HTTP相关的注解,如`@GetMapping`、`@PostMapping`等。这些注解描述了HTTP请求的细节,包括URL、HTTP方法、参数等。

2. 动态代理
   - 当创建一个OpenFeign客户端实例时,OpenFeign会使用Java的动态代理机制为定义的接口生成一个代理对象。
   - 代理对象的方法对应于接口中定义的HTTP请求。当调用代理对象的方法时,实际上是在执行相应的HTTP请求。

3. 解析注解和构建请求
   - 在代理对象的方法被调用时,OpenFeign会解析接口方法上的注解,获取HTTP请求的相关信息。
   - 根据这些信息,OpenFeign会构建一个HTTP请求,包括请求方法、URL、 headers和请求体等。

4. 负载均衡和服务发现
   - OpenFeign集成了Spring Cloud的服务发现和负载均衡功能。
   - 在发送HTTP请求之前,OpenFeign会通过服务发现组件(如Eureka、Consul等)查找目标服务的可用实例,并根据负载均衡策略选择一个实例来发送请求。

5. 编码器和解码器
   - OpenFeign支持自定义的编码器和解码器,用于处理请求和响应的序列化和反序列化。
   - 默认情况下,OpenFeign集成了Spring的`HttpMessageConverters`,可以处理常见的数据格式,如JSON、XML等。

6. 异常处理
   - OpenFeign提供了统一的异常处理机制,当HTTP请求发生错误时,会抛出相应的异常,如`FeignException`及其子类。
   - 开发者可以通过捕获这些异常来处理服务调用失败的情况。

总的来说,OpenFeign通过接口定义和注解简化了服务间HTTP调用的编码工作,利用动态代理和注解解析技术实现了透明化的HTTP请求执行,同时整合了Spring Cloud的服务发现和负载均衡功能,为微服务架构中的服务间通信提供了一种高效、便捷的解决方案。

4.SpringBoot读取配置文件内容的方式

Spring Boot 中读取配置文件有以下 5 种方法:

  1. 使用 @Value 读取配置文件。

  2. 使用 @ConfigurationProperties 读取配置文件。

  3. 使用 Environment 读取配置文件。

  4. 使用 @PropertySource 读取配置文件。

  5. 使用原生方式读取配置文件。

    在Spring Boot中,读取配置文件内容主要有以下几种方式:
    
    1. **使用 `@Value` 注解**:
       - `@Value` 注解可以直接用于字段、方法或方法参数上,从配置文件中注入单个属性值。
       - 示例:
         ```java
         @Value("${property.name}")
         private String propertyName;
         ```
    
    2. **使用 `@ConfigurationProperties` 注解**:
       - `@ConfigurationProperties` 注解主要用于将配置文件中的多个相关属性绑定到一个Java对象中。
       - 首先,需要创建一个Java类来表示配置属性,并用 `@ConfigurationProperties` 注解标记。
       - 然后,可以通过 `@EnableConfigurationProperties` 注解或者将该类作为 `@Component` 或 `@Service` 等注解的bean来启用配置属性的绑定。
       - 示例:
         ```java
         @ConfigurationProperties(prefix = "myapp")
         public class MyAppProperties {
             private String name;
             private int port;
             // getters and setters...
         }
         ```
         在配置文件中:
         ```yaml
         myapp:
           name: My Application
           port: 8080
         ```
    
    3. **使用 `Environment` 接口**:
       - Spring Boot提供了一个 `Environment` 接口,可以用来访问和操作所有的环境属性,包括配置文件中的属性。
       - 你可以通过 `@Autowired` 注入 `Environment` 对象,然后调用其 `getProperty` 方法来获取属性值。
       - 示例:
         ```java
         @Autowired
         private Environment env;
    
         public void readProperty() {
             String propertyName = env.getProperty("property.name");
         }
         ```
    
    4. **使用 `@Configuration` 和 `@Bean` 注解**:
       - 如果你需要在配置类中读取配置文件并基于这些值创建bean,可以使用 `@Configuration` 和 `@Bean` 注解。
       - 在 `@Bean` 方法中,你可以注入 `Environment` 并读取配置文件中的值。
       - 示例:
         ```java
         @Configuration
         public class AppConfig {
    
             @Autowired
             private Environment env;
    
             @Bean
             public MyBean myBean() {
                 String propertyName = env.getProperty("property.name");
                 return new MyBean(propertyName);
             }
         }
         ```
    
    5. **使用 `PropertySourcesPlaceholderConfigurer`**:
       - 虽然在大多数情况下不需要显式使用,但在某些场景下,你可能需要自定义 `PropertySourcesPlaceholderConfigurer` 来处理占位符替换。
       - 这种方式主要用于更复杂的属性解析和占位符替换。
    
    6. **使用 `ConfigurableEnvironment`**:
       - `ConfigurableEnvironment` 是 `Environment` 的一个扩展接口,提供了更多的配置选项和访问环境属性的方式。
    
    以上就是Spring Boot中常见的读取配置文件内容的方式。根据具体需求和项目结构,可以选择最适合你的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/257844.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云原生系列2-GitLab和Jenkins

1、GitLab类似github,是个私有仓库 1、GitLab安装,至少8G内存4核cpu # 查找Gitlab镜像 docker search gitlab/gitlab-ce # gitlab镜像拉取 docker pull gitlab/gitlab-ce # 查看镜像 docker images # 本机先建3个目录,为了gitlab容器通过挂…

【web安全】密码爆破讲解,以及burp的爆破功能使用方法

前言 菜某总结,欢迎指正错误进行补充 密码暴力破解原理 暴力破解实际就是疯狂的输入密码进行尝试登录,针对有的人喜欢用一些个人信息当做密码,有的人喜欢用一些很简单的低强度密码,我们就可以针对性的生成一个字典,…

轻量级购物小程序H5产品设计经典样例

主要是看到这个产品设计的不错值得借鉴特记录如下: 不过大多数购物app都大致相同,这个算是经典样例,几乎都可以复制,我第一次使用,感觉和顺畅。看上去产品是经过打磨的,布局非常好。内容也很丰富。支持异业…

【Linux】冯诺依曼体系结构与操作系统及其进程

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c,Python等 > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解冯诺依曼体系结构与操作系统,掌握…

pytorch中nn.Sequential详解

1 nn.Sequential概述 1.1 nn.Sequential介绍 nn.Sequential是一个序列容器,用于搭建神经网络的模块被按照被传入构造器的顺序添加到容器中。除此之外,一个包含神经网络模块的OrderedDict也可以被传入nn.Sequential()容器中。利用nn.Sequential()搭建好…

AWS 知识二:AWS同一个VPC下的ubuntu实例通过ldapsearch命令查询目录用户信息

前言: 前提:需要完成我的AWS 知识一创建一个成功运行的目录。 主要两个重要:1.本地windows如何通过SSH的方式连接到Ubuntu实例 2.ldapsearch命令的构成 一 ,启动一个新的Ubuntu实例 1.创建一个ubuntu实例 具体创建实例步骤我就不…

useConsole的封装,vue,react,htmlscript标签,通用

之前用了接近hack的方式实现了console的封装,目标是获取console.log函数的执行(调用栈所在位置)所在的代码行数。 例如以下代码,执行window.mylog(1)时候,console.log实际是在匿名的箭头函数()>{//这里执行的} con…

通过https协议访问Tomcat部署并使用Shiro认证的应用跳转登到录页时协议变为http的问题

问题描述: 在最近的一个项目中,有一个存在较久,并且只在内部城域网可访问的一个使用Shiro框架进行安全管理的Java应用,该应用部署在Tomcat服务器上。起初,应用程序可以通过HTTP协议访问,一切运行都没…

力扣面试题 16.19. 水域大小(java DFS解法)

Problem: 面试题 16.19. 水域大小 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 该问题可以归纳为一类遍历二维矩阵的题目,此类中的一部分题目可以利用DFS来解决,具体到本题目(该题目可以的写法大体不变可参看前面几个题目&#…

XZ_iOS 之 M1 M2 M3的M系列芯片的Mac苹果电脑安装cocoapods

安装的前提,应用程序->终端->右键-显示简介->勾选 使用Rosetta打开,如下图,然后重启终端 安装的顺序如下:Homebrew->rvm->ruby->cocoapods 1、安装Homebrew /bin/bash -c "$(curl -fsSL https://raw.git…

淘宝类目信息API接口获取淘宝商品分类信息API调用说明(含APIkey密钥)

cat_get-获得淘宝分类详情 item_cat_get-获得淘宝商品类目 公共参数 名称类型必须描述keyString是调用key(点此获取)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_…

【Mac】flutter项目集成高德定位SDK,获取key

一、获取调试版安全码SHA1 1.进入当前用户文件夹下的~/.android目录 cd ~/.android2.查看 debug.keystore ls3.运行 debug.keystore keytool -list -v -keystore debug.keystore这里报错: The operation couldn’t be completed. Unable to locate a Java Runt…

docker 安装及配置 nginx + tomcat(四):高可用

文章目录 1. 引言2. 高可用架构3. 实际步骤3.1 虚拟机新建系统3.2 安装 keepalived3.3 配置 keepalived3.4 启动 keepalived3.5 验证高可用3.5.1 查看当前效果3.5.2 模拟灾难 4 参考 1. 引言 前情提要: 《docker 安装及配置 nginx tomcat(一&#xff0…

安全运营之安全加固和运维

安全运营是一个将技术、流程和人有机结合的复杂系统工程,通过对已有安全产品、工具和服务产出的数据进行有效的分析,持续输出价值,解决安全问题,以确保网络安全为最终目标。 安全加固和运维是网络安全运营中的两个重要方面。 安全…

在本地通过 k8s 部署一个 nginx 镜像

目标 目标:通过 deployment 启动一个 nginx,并且通过浏览器访问。 目的,熟悉并学习一下 k8s 的一些特性,毕竟看文档和实操是两码事。 本地部署 k8s 简单点,也不用 minikube 和 kubeadmin,直接通过 docker desktop 部署 k8s。 下载 docker desktop 下载完成后会自动…

Linux系统之部署Linux管理面板1Panel

一、介绍 1.1简介 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 1.2特点 快速建站:深度集成 Wordpress 和 Halo,域名绑定、SSL 证书配置等一键搞定; 高效管理:通过 Web 端轻松管理 Linux 服务器,包括应用管…

ios备忘录怎么导入华为 方法介绍

作为一个常常需要在不同设备间切换的人,我深知备忘录的重要性。那些突如其来的灵感、重要的会议提醒、甚至是生活中的琐碎小事,我们都习惯性地记录在备忘录里。但当我决定从iPhone转向华为时,一个问题困扰了我:如何将那些珍贵的备…

使用Axure的中继器的交互动作解决增删改查h

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《产品经理如何画泳道图&流程图》 ⛺️ 越努力 ,越幸运 目录 一、中继器的交互 1、什么是中继器的交互 2、Axure中继器的交互 3、如何使用中继器? 二…

CleanMyMac X 4 for Mac(Mac优化清理工具)v4.14.6中文破解版

CleanMyMac X for Mac中文破解版只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉,节省宝贵的磁盘空间。cleanmymac x个人认为X代表界面上的最大升级,功能方面有更多增加,与最新macOS系统更加兼容,流畅地与系统性…

人工智能中不可预测的潜在错误可能是灾难性的——数学解释

一、说明 有没有人研究评估AI的错误产生的后果有多么严重,是否存在AI分险评估机制?更高维度上,人工智能的未来是反乌托邦还是乌托邦?这个问题一直是争论的话题,各大阵营都支持。我相信我们无法准确预测这两种结果。这是…