1.Spring Cloud 简介
Spring Cloud 是基于Spring Boot 实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理,服务发现,微代理,全局所,分布式会话和集群管理提供了一种简单的开发方式。
Spring Cloud 包含了多个子项目(针对分布式系统中涉及的多个不同的开源产品),如:Spring cloud config,Spring cloud netflix(微服务架构),Spring cloud AWS,Spring cloud security,Spring cloud commons,Spring cloud zookeeper。
2.微服务架构概念
微服务架构就是将一个完整的应用程序从数据存储开始垂直的分成若干个不同的服务,每个服务都可以独立部署,独立维护,独立扩展,服务于服务之间可以通过诸如restful api 的方式互相调用。
3.服务治理(Spring Cloud Eureka)
Spring Cloud Eureka是Spring Cloud netflix 项目下的服务治理模块.
Spring Cloud netflix 项目是Spring cloud的子项目之一,主要是对netflix公司的一系列开源产品的包装,它为Spring boot提供了自配置的 netflix oos整合,通过一些简单的注解,开发者就可以快速的在应用中配置常用模块并构建庞大的分布式系统,它只要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),客户端负载均衡(Ribbon)。
4.使用Eureka实现服务治理的方式:
①在spring boot 配置中增加 Eureka 依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
②使用@EnableEurekaServer 注解启动服务注册中心提供给其他应用进行对话(在一个普通的Spring Boot项目中添加@EnableEurekaServer 注解即可)
③禁用Eureka 自身注册客户端的行为:在 application.propertites中增加配置:
|
使用地址 http://localhost:1001/ 可以访问 eureka服务注册中心
4.服务治理(Spring Cloud Consul)
Consul是一个分布式高可用的系统,它包含多个组件,但是作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置的工具,它包含以下几个特性: 服务发现,健康检查,key/value存储,多数据中心
将eureka服务治理转为Consul步骤:
①修改配置文件中的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
②修改 application.propertites文件,将consul需要的配置加入即可,如下为默认配置
|
5.服务发现的接口(DiscoveryClient)
是Spring Cloud 对服务治理做的一层抽象,它可以屏蔽eureka和consul对服务治理的实现细节,我们的程序不需要做任何修改,只需要引入不同的服务治理依赖,并配置相关的配置属性就可以将微服务纳入到Spring Cloud的各个服务治理架构中。
6.消费服务提供者的接口(LoadBalancerClient(spring 提供负载均衡客户端实现服务消费),基本写法,需要手动编写代码,服务选取,拼接地址等)
服务消费步骤:
①引入相关依赖:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> |
②配置application.propertites,指定服务注册地址,以eureka为例
spring.application.name=eureka-consumer server.port=2101 eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/ |
③使用@EnableDiscoveryClient注解将应用加入到服务治理体系中
④初始化RestTemplate,用来发起真正的rest请求
@EnableDiscoveryClient @SpringBootApplication public class Application { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } } |
⑤创建一个接口来消费rureka-client提供的接口
@RestController public class DcController { @Autowired LoadBalancerClient loadBalancerClient; @Autowired RestTemplate restTemplate; @GetMapping("/consumer") public String dc() { ServiceInstance serviceInstance = loadBalancerClient.choose("eureka-client"); String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/dc"; System.out.println(url); return restTemplate.getForObject(url, String.class); } } |
说明:在application中注入RestTemplate和loadBalancerClient,在/consumer中使用loadBalancerclient的choose来负载均衡的选择出了eureka-client的服务实例,服务的基本信息存储在ServiceInstance,然后通过对象的一些信息拼接出/dc的访问地址,最后用restTemplate实现对服务提供者的调用。
7.spring cloud ribbon 工具包(可以省略第6章手动编写代码的步骤)
概念:spring cloud bibbon 是基于netflix ribbon实现的一套客户端负载均衡的工具,它是基于http和tcp的,通过配置ribbonserverlist服务列表去轮询访问以达到均衡负载的作用
ribbon实现客户端负载均衡步骤:
①添加依赖:
<dependencies> ... <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> </dependencies> |
②修改应用主类,为RestTemplate
增加@LoadBalanced
注解:
@EnableDiscoveryClient @SpringBootApplication public class Application { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } } |
③修改Controller。去掉原来通过LoadBalancerClient
选取实例和拼接URL的步骤,直接通过RestTemplate发起请求。
@RestController public class DcController { @Autowired RestTemplate restTemplate; @GetMapping("/consumer") public String dc() { return restTemplate.getForObject("http://eureka-client/dc", String.class); } } |