Spring Cloud
Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的开发便利性,巧妙地简化了分布式系统基础设施的开发,如服务注册、服务发现、配置中心、消息总线、负载均衡、断路器、数据监控等,这些都可以用 Spring Boot 的开发风格做到一键启动和部署。
通俗地讲,Spring Cloud 就是用于构建微服务开发和治理的框架集合(并不是具体的一个框架)
Spring Cloud 模块介绍
- Eureka:服务注册中心,用于服务管理。
- Ribbon:基于客户端的负载均衡组件。
- Hystrix:容错框架,能够防止服务的雪崩效应。
- Feign:Web 服务客户端,能够简化 HTTP 接口的调用。
- Zuul:API 网关,提供路由转发、请求过滤等功能。
- Config:分布式配置管理。
- Sleuth:服务跟踪。
- Stream:构建消息驱动的微服务应用程序的框架。
- Bus:消息代理的集群消息总线。
- …其他模块
本文接下来将介绍其中几个模块
Spring Cloud 版本选择
访问Git官方, 我们可以看到, 官方推出2.0以后, 强烈建议1.5版本升级到2.0
Spring Cloud 版本命名规则采用了伦敦地铁站的名称来命名, 并由地铁站名称字母A-Z依次类推迭代版本。
Spring Cloud & Spring Boot 版本选择
在官网上可以看到推荐的具体版本
Spring Cloud 和 Dubbo 的区别
作为新一代的服务框架,它为微服务架构提供了更加全面的技术支持。我们可以看一下整体对比
很明显,Spring Cloud 的功能比 Dubbo 更加强大,涵盖面更广,而且作为 Spring 的拳头项目,它也能够与 Spring Framework、Spring Boot、Spring Data 等其他 Spring 项目完美融合,这些对于微服务而言是至关重要的。
更重要的是,相比于 Dubbo,它是一个正在持续维护的、社区更加火热的开源项目,这就可以保证使用它构建的系统持续地得到开源力量的支持。
Feign
Feign 是一个声明式的 REST 客户端,它能让 REST 调用更加简单。Feign 供了 HTTP 请求的模板,通过编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地址等信息。
而 Feign 则会完全代理 HTTP 请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。
Spring Cloud 对 Feign 进行了封装,使其支持 SpringMVC 标准注解和 HttpMessageConverters。Feign 可以与 Eureka 和 Ribbon 组合使用以支持负载均衡。
常用的接口调用方式
1)Httpclient
HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。
2)RestTemplate
RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。
下面我们看看Feign 是如何调用的
Feign 使用
- 引入Feign依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在启动类上加 @EnableFeignClients 注解,如果你的 Feign 接口定义跟你的启动类不在同一个包名下,还需要制定扫描的包名 @EnableFeignClients(basePackages=“com.xxx”),代码如下所示。
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.xxx")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application .class, args);
}
}
定义一个 Feign 的客户端,以接口形式存在,代码如下所示。
@FeignClient(value = "user-service")
public interface UserClient {
@GetMapping("/user/hello")
String hello();
}
首先我们来看接口上加的 @FeignClient 注解。这个注解标识当前是一个 Feign 的客户端,value 属性是对应的服务名称,也就是你需要调用哪个服务中的接口。
接下来是Controller中的调用
@Autowired
private UserClient userClient;
@GetMapping("/hello")
public String hello() {
//return restTemplate.getForObject("http://localhost:8088/house/hello",String.class);
//String result = restTemplate.getForObject("http://user-service/user/hello",String.class);
String result = userClient.hello();
System.out.println("调用结果:" + result);
return result;
}
通过跟注释掉的代码相比可以发现,我们的调用方式变得越来越简单了,而Feign帮我们实现了远程调用服务