SpringCloud02

发布时间:2023年12月20日

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中常见的读取配置文件内容的方式。根据具体需求和项目结构,可以选择最适合你的方法。

文章来源:https://blog.csdn.net/g877835148/article/details/135093637
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。