SpringCloud初次使用

it2024-12-15  19

1.概念 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。

2.为什么使用Spring Cloud Spring Cloud对于中小型互联网公司来说是一种福音,因为这类公司往往没有实力或者没有足够的资金投入去开发自己的分布式系统基础设施,使用Spring Cloud一站式解决方案能在从容应对业务发展的同时大大减少开发成本。同时,随着近几年微服务架构和Docker容器概念的火爆,也会让Spring Cloud在未来越来越“云”化的软件开发风格中立有一席之地,尤其是在目前五花八门的分布式解决方案中提供了标准化的、全站式的技术方案,意义可能会堪比当前Servlet规范的诞生,有效推进服务端软件系统技术水平的进步。

3.Spring Cloud是分布式系统的整体解决方案

SpringBoot&Spring什么关系? SpringBoot底层就是Spring,简化使用Spring的方式而已,多加了好多的自动配置;

Spring Cloud&SpringBoot什么关系? Spring Cloud是分布式系统的整体解决方案,底层用的SpringBoot来构建项目,Cloud新增很多的分布式的starter,包括这些starter的自动配置;

4.SpringCloud_helloworld案例开发-父工程搭建

修改pom文件 <!--说明:删除dependencies与build,添加dependencyManagement元素提供了一种管理依赖版本号的方式。 在dependencyManagement元素中声明所依赖的jar包的版本号等信息, 那么所有子项目再次引入此依赖jar包时则无需显式的列出版本号。--> <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.7.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.offcn</groupId> <artifactId>demo</artifactId> <version>0.0.1</version> <name>demo</name> <description>Demo project for Spring Boot</description> <!--必须为pom文件--> <packaging>pom</packaging> <properties> <java.version>1.8</java.version> </properties> <!--版本控制--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.RELEASE</version> <type>pom</type> <!--指明是一个聚合工程--> <scope>import</scope> <!--以导入的方式加入到子模块--> </dependency> </dependencies> </dependencyManagement> </project>

5. SpringCloud_helloworld案例开发-注册中心–eureka

示意图 eureka分为两个角色,分别是service和client,其中注册中心是service,服务提供者与调用者都是client 步骤如下: 1.引入配置文件 2.编写配置文件 3.增加注册中心服务端注解 引入配置文件 <!--引入eureka依赖--> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> 编写yml配置文件 spring: application: name: EurekaServer # 应用名称 server: port: 8761 #内置的tomcat服务启动监听端口号 eureka: instance: hostname: localhost # ip地址或者计算机名 client: register-with-eureka: false #此EurekaServer不在注册到其他的注册中心,单节点配置必加 fetch-registry: false #不在从其他中心中心拉取服务器信息,单节点配置必加 service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka 编写启动类,EureakServerStart @SpringBootApplication //主启动类注解 @EnableEurekaServer //开启注册中心,服务端的声明 public class EureakServerStart { public static void main(String[] args) { SpringApplication.run(EureakServerStart.class); } } 检验是否成功,出现如下代表成功 6.注册中心—提供者引入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>demo</artifactId> <groupId>com.offcn</groupId> <version>0.0.1</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>provider_movie</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> <!--服务提供者注入到注册中心 erueka 1.引入依赖 2.修改配置 3.增加注解--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> </project> 修改配置文件 server: port: 8000 spring: application: name: providerMovie eureka: client: service-url: defaultZone: http://localhost:8761/eureka instance: prefer-ip-address: true #注册服务时使用IP地址 启动类加注解 @SpringBootApplication @EnableEurekaClient //注册中心客户端启动 public class ProviderMovieStart { public static void main(String[] args) { SpringApplication.run(ProviderMovieStart.class); } }

7.注册中心–消费者注册与ribbon

介绍 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。

2.引入依赖

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>demo</artifactId> <groupId>com.offcn</groupId> <version>0.0.1</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>consumer_user</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> <!--注册中心客户端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--引入Ribbon--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> </dependencies> </project> 修改配置文件 server: port: 9000 spring: application: name: consumerUser eureka: client: service-url: defaultZone: http://localhost:8761/eureka instance: prefer-ip-address: true 在启动类声明RestTemplate @LoadBalanced //开启负载均衡 //默认的负载均衡策略 轮询 @Bean //<bean id="" class=""> public RestTemplate getRestTemplate(){ return new RestTemplate(); } 远程调用服务,采用Restful风格 @Autowired //远程调用 http协议 private RestTemplate restTemplate; public Map<String, Object> buyMovie(Long userId) { Map<String, Object> resultMap = new HashMap<>(); //1.根据userId查询用户对象 User user = this.getUserById(userId); //2.远程调用电影服务接口查询电影对象 Movie movie = restTemplate.getForObject("http://PROVIDERMOVIE/movie/getNewMovie", Movie.class); //3.设置map resultMap.put("user", user); resultMap.put("movie", movie); return resultMap; } 增加主启动类eureka注解 @SpringBootApplication @EnableEurekaClient public class ConsumerUserStart { public static void main(String[] args) { SpringApplication.run(ConsumerUserStart.class); } @LoadBalanced //开启负载均衡 //默认的负载均衡策略 轮询 @Bean //<bean id="" class=""> public RestTemplate getRestTemplate(){ return new RestTemplate(); } }

8.Feign使用

Feign介绍 Feign是一个声明性的web服务客户端,它使编写web服务客户机变得更容易。使用Feign创建接口并对其进行注释,就可以通过该接口调用生产者提供的服务。Spring Cloud对Feign进行了增强,使得Feign支持了Spring MVC注解 两点:1、Feign采用的是接口加注解; 2、Feign 整合了ribbon 引入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>demo</artifactId> <groupId>com.offcn</groupId> <version>0.0.1</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>consumer_feign_user</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--feign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies> </project>

2.修改配置文件

server: port: 7000 spring: application: name: consumerFeignUser eureka: client: service-url: defaultZone: http://localhost:8761/eureka instance: prefer-ip-address: true 新建接口,加注解@FeignClient @FeignClient(value = "PROVIDERMOVIE") //远程调用的服务ID public interface MovieServiceFeign { @GetMapping("/movie/getNewMovie") //服务提供者提供服务,restful风格,其实就是调用远程服务 public Movie getNewMovie(); } 注入该接口,并进行调用 @Autowired private MovieServiceFeign movieServiceFeign; //2.远程调用电影服务接口查询电影对象 Movie movie = movieServiceFeign.getNewMovie(); 主启动类开始Feign @SpringBootApplication @EnableDiscoveryClient //@EnableEurekaClient 范围小 @EnableDiscoveryClient 注册中心可以是其他组件 @EnableFeignClients // 开启feign public class ConsumerFeignUserStart { public static void main(String[] args) { SpringApplication.run(ConsumerFeignUserStart.class); } }

9.熔断机制:Ribbon+Hystrix组合

流程 1.引入依赖 2.主启动类开启短路保护 3.方法上加注解,@HystrixCommand(fallbackMethod="xxx")来指定出错时调用xx方法, 在本类编写buyMovieFallbackMethod方法,方法的参数、返回值和原来一样即可 引入依赖 <!-- 引入hystrix进行服务熔断 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> 开启短路保护功能 @SpringBootApplication @EnableDiscoveryClient @EnableCircuitBreaker //开启断路保护功能 public class ConsumerUserStart { public static void main(String[] args) { SpringApplication.run(ConsumerUserStart.class); } @LoadBalanced //负载均衡 @Bean public RestTemplate getRestTemplate(){ return new RestTemplate(); } } 方法上加注解 @HystrixCommand(fallbackMethod = "buyMovieFallbackMethod") public Map<String, Object> buyMovie(Integer id) { Map<String, Object> result = new HashMap<>(); //1.查询用户信息 User user = this.getUserById(id); result.put("user", user); //2.查到最新电影票 Movie movie = restTemplate.getForObject("http://PROVIDERMOVIE/movie",Movie.class); result.put("movie", movie); return result; } 测试正常调用&停止user服务,测试异常调用&启动user服务过一段时间测试是否正常

10.Feign+Hystrix组合

流程 1.引入依赖 2.修改yml文件,开启Fegin对Hystrix支持 3.主配置类开启短路保护,@EnableCircuitBreaker 4.对远程服务调用的接口文件,扩展增加@FeignClient(value = "PROVIDERMOVIE",fallback = MovieFeignExceptionHandlerService.class) 其中fallback是该接口的实现类文件。实现类需要注入容器里使用@component 引入依赖 <!-- 引入hystrix进行服务熔断 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> 修改application.yml,开启Feign对Hystrix支持 # 开启Feign的熔断功能 feign: hystrix: enabled: true 主配置类开启短路保护,@EnableCircuitBreaker @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients //开启Feign功能 @EnableCircuitBreaker //开启断路保护功能 public class ConsumerUserStart { public static void main(String[] args) { SpringApplication.run(ConsumerUserStart.class); } } 增加异常处理类 @FeignClient(value = "PROVIDERMOVIE",fallback = MovieFeignExceptionHandlerService.class) //与被调用的服务名称一致 public interface MovieServiceFeign { @GetMapping("/movie") public Movie getNewMovie(); //与被条用服务端映射方法一致 } //异常处理接口实现类 @Component public class MovieFeignExceptionHandlerService implements MovieServiceFeign { /** * 远程这个方法调用出问题就会调用此方法 */ @Override public Movie getNewMovie() { Movie movie = new Movie(); movie.setId(-100); movie.setMovieName("无此电影呀..."); return movie; } 测试正常调用&停止user服务,测试异常调用&启动user服务过一段时间测试是否正常

数据流监控Hystrix Dashboard

流程 1.引入actuator依赖 http://localhost:7000/actuator/health 2.修改yml文件 http://localhost:7000/actuator/hystrix.stream 3.引入HystrixDashboard 4.开启可视化监控功能,修改主启动类增加@EnableHystrixDashboard 引入actuator依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>

actuator是用来监控SpringBoot服务的,注意路径问题,具体的版本可能不一样,参考启动日志 http://localhost:7000/actuator/health 可提供的监控服务

修改配置文件 management: endpoints: web: exposure: include: hystrix.stream #访问/actuator/hystrix.stream能看到不断更新的监控流

浏览器访问http://localhost:7000/actuator/hystrix.stream 可以看到打印

引入HystrixDashboard,可视化监控 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency> 主启动类增加注解 @EnableHystrixDashboard // 可视化监控

访问http://localhost:7000/hystrix,将Hystrix的stream地址输入(http://localhost:7000/actuator/hystrix.stream ),点击monitor按钮即可监控

最新回复(0)