Spring Boot总结(八):云应用开发

Spring Boot总结(一):入门

Spring Boot总结(二):Spring Boot中使用数据库

Spring Boot总结(三):Spring Boot界面设计

Spring Boot总结(四):提高数据库访问性能

Spring Boot总结(五):安全设计

Spring Boot总结(六):Spring Boot SSO

Spring Boot总结(七):使用分布式文件系统

Spring Boot总结(八):云应用开发

Spring Boot总结(九):构建高性能的服务平台

Spring Boot总结(十):自动配置实现原理

Spring Boot总结(十一):数据访问实现原理

扫描二维码关注公众号,回复: 2637140 查看本文章

Spring Boot总结(十二):微服务核心技术实现原理

Spring Cloud是一套云应用开发工具集,为分布式的微服务开发提供了一整套简单的实用工具。

Spring Cloud主要包括配置管理、服务发现、动态路由、负载均衡、断路器、安全管理、事件总线、分布式消息等组件的开发工具包;

Spring Cloud组件:

  1. spring-cloud-aws
  2. spring-cloud-bus
  3. spring-cloud-cli
  4. spring-cloud-commons
  5. spring-cloud-config
  6. spring-cloud-netflix
  7. spring-cloud-security
  8. spring-cloud-starters
  9. spring-cloud-cloudfoundry
  10. spring-cloud-cluster
  11. spring-cloud-consul
  12. spring-cloud-sleuth
  13. spring-cloud-stream
  14. spring-cloud-zookeeper
  15. spring-boot
  16. spring-cloud-stream-app-starters*
  17. spring-cloud-task*

Spring  Cloud在Brixton.M4版本之后,Maven可以使用spring-cloud-starter-parent方式来简化工程的依赖配置;

Spring boot和Spring Cloud关闭密切,能够趋于完美的结合使用;

8.1 使用配置管理

一个项目工程总是需要一些配置,例如,需要配置服务器的端口、访问数据库的参数或者其他一些项目需要使用的参数等。而一个大型的分布式系统可能存在很多这样需要配置的项目工程,这时候,配置管理就将是一个庞大的工程,所以弄不好很容易出错。因此对于一个分布式系统来说,迫切需要一个单独的系统来专门管理各个项目的配置。Spring Cloud的配置管理就是这样一个工具包。

使用Spring Cloud的配置管理开发工具包,只要创建一个简单的工程,就可以实现分布式的配置管理服务,它还支持在线更新,即如果更新了配置文件,使用这个配置文件的客户端就不用重启就可以使用最新的配置;

1. 创建配置管理服务器

为了给客户端提供配置管理的服务,单独的创建一个工程,用来构建一个配置管理服务器。首先,工程的Maven管理中心引用如下的配置:

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-config-server</artifactId>

    <version>2.0.0.M5</version>

</dependency>

然后创建一个主程序,使用如下注解:

@SpringBootAPPlication

@EnableConfigServer

@EnableDiscoveryClient

public class ConfigApplication(){

         public static void main(String[] args){

         SpringApplication.run(ConfigApplication.class,args)

}

}

这样,就创建了一个配置管理服务器,它能够为客户端提供配置文件的管理和更新等。

配置管理服务器中使用的文件格式与工程的本地配置文件格式一样,既可以使用.properties扩展名,也可以使用.yml扩展名。配置文件的存储目录目前支持使用本地存储、Git以及Subversion等方式。

在配置管理服务器的本地工程配置文件中,进行如下的设置,其中url指定资源库的位置:

spring:

         cloud:

                   config:

                            server:

                                     git:

                                               uri:https://github.com/chenfromsz/spring-cloud-config-repo

该资源库包含如下的文件

Application.yml

web.yml

web-development.yml

data.yml

data-development.yml

2. 使用配置管理的客户端

客户端如果要使用配置管理服务,首先需要在工程的Maven依赖管理中加入配置管理组件spring-cloud-starter-config的依赖,使用配置管理服务之后,如果本地的配置文件与配置管理服务器的配置文件有相同的配置项,将优先使用配置管理服务器的配置项,也就是说本地的配置项将会被覆盖;

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-config</artifactId>

    <version>2.0.0.M5</version>

</dependency>

其次,使用配置管理的客户端必须在本地的配置中,事先做好连接配置管理服务器,以及需要使用由配置管理服务器提供的配置文件等参数的设定;

各个使用配置管理客户端项目中一个名为bookstrap.yml的本地配置文件,就是用来设定连接配置管理服务器、应用的名称,以及需要由配置管理服务器提供的配置文件等参数;

配置中的一些参数如下:

uri:设定连接配置管理服务器的地址和端口

name:用来指定应用的名称和配置文件的名称

profiles:可以理解为使用配置文件名称的后缀部分。例如这个配置本身,因为profiles设定了development,所以它使用的配置文件将是web-development.yml或者web-development.properties。如果不使用profiles这个参数,即使用没有文件后缀部分的配置文件,例如,这个配置将使用web.yml或者web.properties配置文件。

如果在资源库中有application.yml或者application.properties文件,则默认加载。

         另外,也可以在config参数下面使用name和profiles来指定配置文件的名称和后缀,即与上面的应用名称分来进行配置。

使用name和profiles这两个参数,可以设定不同环境使用不同的配置文件,这对于在开发环境中和在生产环境中使用不同的配置文件来讲,是非常方便的,只要更改profiles参数即可;

spring:

         application:

                            name:web

         profiles:

                   active:development

         cloud:

                   config:

                            uri:http://localhost:8888

设定这些配置参数之后,就可以使用配置管理服务器提供的服务了。

使用@Value注解引用即可;

注意:

         对于客户端中的一些启动参数的设置,如应用服务器的端口设定、数据库的连接地址、用户和密码等配置是在工程启动的时候进行加载,并且中途不能变更,所以这些启动参数虽然可以使用配置管理的配置,但是不能使用自动更新功能;

在启动项目的时候首先启动配置管理服务模块,然后启动使用这些配置的客户端模块;

如果暂时不需要使用配置管理服务器提供的配置,只是想要使用本地的配置文件,可以把

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-config</artifactId>

    <version>2.0.0.M5</version>

</dependency>

先注释掉即可;

3. 实现在线更新

上面的配置管理服务做到了对分布式系统的配置文件统一管理的功能,但是只有在应用启动的时候才会加载。这显然是不够理想的;

如果想要实现在线更新,必须在需要使用更新配置的Bean中增加一个注解:@RefreshScope

在线更新还必须使用一个指令来触发。使用下面的指令才能触发更新;

curl -X POST http://localhost:9001/refresh

提示:

curl是UNIX系统的指令,上面指令需要使用POST方式发送,执行上面指令需要有Linux类型的系统。如果是Windows系统,使用Git Bash窗口,同样也可以使用UNIX指令。上面的参数大小写敏感;

4. 更新所有客户端的配置

使用上面的方式,只能一次更新一个配置,在应用很多的情况下,相当的麻烦。

【解决方案】

使用事件总线Spring-cloud-bus,就可以在线更新所有连接配置管理服务器的客户端。这样,仅仅使用一条指令就可以更新所有的客户端的配置;

因为spring-cloud-bus是使用分布式消息发布机制,通过RabbitMQ使用消息分发的方法来执行更新的。所以还必须安装RabbitMQ服务器,才能实现消息分发;

  1. 启动spring-cloud-bus功能,首先需要在配置管理服务器和所有使用配置管理服务器的客户端的Maven依赖管理中,都需要加入如下的依赖配置:

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-bus</artifactId>

    <version>2.0.0.M4</version>

</dependency>

  1. 其次,在配置管理服务器和所有的连接配置管理服务器的客户端的本地配置文件中,配置连接RabbitMQ服务器的IP、端口以及用户名和密码等参数;

spring:

         rabbitmq:

                            addresses:amqp://192.168.1.214.5672

                            username:alan

                            password:alan

  1. 现在可以使用如下的指令,更新所有在线的使用配置管理的客户端,假设配置管理服务器的端口是8888:

curl -X POST http://localhost:8888/bus/refresh

  1. 和上一点中curl更新不同的两点:第一,它必须使用配置管理服务器的地址来执行,第二:它的URL中多了一个bus;
  2. 如果自是想更新某一个客户端,既可以采用上节的方式也可以再用destination参数:curl -X POST http://localhost:8888/bus/refresh?destination=web:**

这样就可以更新名称为web的应用的所有更新

  1. 在线更新同样需要在需要更新的Bean中包含@RefreshScope注解才能适用;
  2. 关于配置管理,还有对配置文件的管理的安全措施和策略,例如设计数字签名、用户名和密码等,可以参考官方资料:

http:projects.spring.io/spring-cloud/spring-cloud.html#_security_2

8.2 使用发现服务

在分布式系统中,可能存在着很多的应用和服务,而各个服务都独立自主的管理自身的数据。在服务和服务之间,有时候可能需要共享一些数据,传统的做法是使用WebService,或者SOAP的方式,由服务提供者一方对外暴露接口,然后由服务消费者一方对接口进行访问,从而达到数据共享的目的。但是不管是使用哪种方式,开发者都必须编写一些接口程序,可能还需要复杂的配置来实现,而使用Spring Cloud,通过发现服务来实现服务之间的数据共享是轻而易举的;

1. 创建发现服务器

要使用发现服务的功能,首先需要创建一个工程,用来构建一个发现服务器,在工程中需要引用如下的Maven依赖配置:

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-eureka-server</artifactId>

    <version>2.0.0.M2</version>

</dependency>

然后创建一个简单的主程序,并在主程序中增加注解@EnableEurekaServer,即启用发现服务器的功能。

@SpringBootApplication

@EnableEurekaServer

在main函数中使用SpringApplication.run()启动程序;

2. 使用发现服务的客户端配置

  1. 使用发现服务的客户端,首先需要在工程中引用如下的Maven依赖配置,用来使用发现服务器提供的功能:

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-eureka</artifactId>

    <version>2.0.0.M2</version>

</dependency>

  1. 在工程的主程序中,增加一个注解@EnableDiscoveryClient,以启用发现服务的客户端功能。
  2. 在工程的配置文件中配置发现服务器的地址和端口,假设发现服务器在本地运行,并且端口号为8761

eureka:

         client:

                   serverUrl:

                                     defaultZone:http://localhost:8761/eureka/

         instance:

                   preferIpAddress:true

  1. 在bookstrap.yml配置文件中,配置应用的名称(应用名称的配置与使用配置管理服务器的配置相同),这个名称就是一个应用在发现服务器中的一个唯一标识,必须保证它的唯一性。

spring:

         application:

                            name:web

3. 发现服务器测试

要测试发现服务器,首先启动实例工程中的discovery项目,然后启动config、data、web等项目,如果各个服务和客户端都运行了,在浏览器中打开地址http://localhost:8761,既可以打开发现服务器的控制台;

8.3 使用动态路由和断路器

上一节中创建了一个发现服务器,并且向其中注册了几个微服务(客户端),这一节将介绍如何在这些服务之间,使用动态路由、断路器和故障容错等功能;

当客户端发现服务器注册之后,客户端之间就可以通过Zuul路由代理协议,使用应用的名称来访问各自的REST资源;

1. 依赖配置

要启用动态路由、断路器和服务监控的功能,首先需要在各个客户端的工程中引用如下的配置:

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-zuul</artifactId>

    <version>2.0.0.M2</version>

</dependency>

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-hystrix</artifactId>

    <version>2.0.0.M2</version>

</dependency>

其次,在各个使用上述功能的工程的主程序中,增加如下的注解,即可启用路由代理服务和用监控服务功能;

@EnableZuulProxy

@EnableHystrix

2. 共享REST资源

使用RepositoryRestResource标注的这个接口不但是一个数据库的资源共享,也会一个REST资源共享,并且可以自定义资源的名称和路径

@RepositoryRestResource(collectionResourceRel=””,path=””)

3. 通过路由访问REST资源

可以使用下面几种方法通过Zuul路由代理方式来访问不同服务中的REST资源;

  1. JavaScript;

在web模块中使用data模块中的REST资源数据的一个jquery例子:

$.get(‘/data/users/search/findByNameContainint?name=’+$(“#name”).val()

         function(data){

         …

}

)

  1. RestTemplate

调用data模块中的方法

@Autowired

RestTemplate restTemplate;

public User getUserByName(String name){

         restTemplate.getForObject(url,class,params);

}

  1. FeignClient

使用注解@FeignClient(“data”)的方式,创建一个接口,调用data模块中的方法

@FeignClient(“data”)

public interface UserClient(){

         @RequestMapping(method=RequestMethod.GET,value=”/user/{id}”)

         User findById(@RequestParam(“id”,Long id));

}

上面各种调用方式,可以按照程序设计的要求选择使用,如果要使用FeignClient,还必须在工程的Maven依赖中添加“spring-cloud-starter-feign”依赖,并在工程的主程序中添加一个注解:@EnabledFeignClients,以启用FeignClient的功能;

4. 使用断路器功能

断路器是微服务中的一个故障容错的线路保护开关,如同电路中的负载保护开关一样,断路器将在所调用的服务过载或者出现故障的时候,自动阻断对服务的访问和调用,转而调用备用方法;

当一个系统服务突然出现故障或者超载的时候,后面访问将会陷入无限的延迟和等待的状态之中,由于请求得不到及时的响应,访问者可能会因此而不断的发送请求,这将造成严重的恶性循环,最终导致整个系统陷入瘫痪状态之中,甚至会完全崩溃。使用断路器可以避免这种情况的发生,起到防患于未然的作用;

使用注解@HystrixCommand可以为指定的方法指定一个备用的方法;

5. 路由器和断路器测试

8.4 使用监控服务

分布式系统中运行着服务,必须有一个管理机制或者方法,能够一目了然的随时了解各个服务的运行情况以及健康指数,以便及时的应对已经出现或者可能出现的故障,做出相应的策略或者改造方案。使用SpringCloud的监控服务,可以实时监控应用的运行情况;

1. 创建监控服务器

监控服务是Spring Cloud工具集中的一个功能组件。要使用监控服务的功能,需要创建一个工程,用来构建一个监控服务器。首先创建一个Maven工程模块:Hystrix,在工程的Maven依赖中引入如下的依赖配置:

<dependency>

    <groupId>org.springframework.cloud</groupId>

    <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>

    <version>2.0.0.M2</version>

</dependency>

然后创建一个主程序,使用注解@EnableHystrixDashboard启用监控功能,使用注解@Controller将改程序标注为一个监控器,并设定访问的根目录,重定向到/hystrix位置上

@SpringApplication

@Controller

@EnbleHystrixDashboard

使用浏览器访问监控页面,然后输入指定的服务的url,实施监控

2. 监控服务器测试

8.5 运行与发布

源代码地址:

https://github.com/chenfromsz/spring-boot-cloud

8.6 小结

本章使用云应用开发工具集Spring Cloud,开发和使用了配置管理、发现服务、动态路由、断路器和监控服务等功能。使用Spring Cloud进行云应用开发非常的简单,但是开发的应用却包含着非常强大的功能,这主要得益于Spring Cloud强大的封装功能;

这一章的主要功能是搭建出了高可用的微服务应用,下一章将介绍使用Docker来发布本章实例的各个应用,如何使用Docker实现服务的负载均衡,以及构建一个高性能的服务平台;

猜你喜欢

转载自blog.csdn.net/qq_36807862/article/details/81285016