Spring Cloud微服务升级总结

博客分类: Spring Cloud 阅读次数:

Spring Cloud微服务升级总结

一.应用系统的架构历史

[Image tex](http://blog.springcloud.cn/images/sc-lx/system.png)

二.什么是微服务?

2.1 微服务概述

2.2 微服务架构的优势

三.Spring Boot/Cloud

3.1 什么是Spring Boot?

Spring Boot框架是由Pivotal团队提供的全新框架,其设计目的是用来简化基于Spring应用的初始搭建以及开发过程。SpringBoot框架使用了特定的方式来进行应用系统的配置,从而使开发人 员不再需要耗费大量精力去定义模板化的配置文件。

3.2 什么是Spring Cloud?

Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理、服务注册,服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。

3.3 微服务,Spring Boot,Spring Cloud三者之间的关系

3.4 Everything is jar, Everything is http

Spring Boot通过@SpringBootApplication注解标识为Spring Boot应用程序。所有的应用都通过jar包方式编译,部署和运行.

@SpringBootApplication
public class Application {
       private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
       public static void main(String[] args) {
           SpringApplication.run(Application.class, args);
           LOGGER.info(”启动成功!");
       }
   }

每个Spring Boot的应用都可以通过内嵌web容器的方式提供http服务,仅仅需要在pom文件中依赖spring-boot-start-web即可,原则上微服务架构希望每个独立节点都提供http服务。

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

3.5 Spring boot Task 任务启动和定时任务

在Spring Boot需要启动任务时,只要继承CommandLineRunner接口实现其run方法即可。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

在Spring Boot需要执行定时任务时,只需要在定时任务方法上增加@Scheduled(cron = “0 15 0 **?”)注解(支持标准cron表达式),并且在服务启动类上增加@EnableScheduling的注解即可。

@SpringBootApplication
@EnableScheduling
public class Application {
    private static final Logger LOGGER = LoggerFactory.getLogger(Application.class);
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        LOGGER.info(”启动成功!");
    }
}

// some class
@Scheduled(cron = "0 15 0 * * ?")
public void someTimeTask() {
  //
}
}

3.6 Spring boot Actuator 监控

Actuator是spring boot提供的对应用系统自身进行监控的组件,在引入spring-boot-start-web基础上引入spring-boot-starter-actuator即可。

<dependency>
<groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>

[Image tex](http://blog.springcloud.cn/images/sc-lx/actuator.png)

3.7 Spring cloud Config 配置中心

在我们实现微服务架构时,每个微服务节点都需要自身的相关配置数据项,当节点众多,维护就变得非常困难,因此需要建立一个中心配置服务。

Spring Cloud Config分为两部分。Spring Cloud Config server作为一个服务进程,Spring Cloud Config File为配置文件存放位置。

[Image tex](http://blog.springcloud.cn/images/sc-lx/config.png)


[Image tex](http://blog.springcloud.cn/images/sc-lx/config_pic.png)

3.8 Spring cloud Eureka 服务注册中心

服务注册的概念早在微服务架构之前就出现了,微服务架构更是把原先的单一应用节点拆分成非常多的微服务节点。互相之间的调用关系会非常复杂,Spring Cloud Eureka作为注册中心,

服务注册的概念早在微服务架构之前就出现了,微服务架构更是把原先的单一应用节点拆分成非常多的微服务节点。互相之间的调用关系会非常复杂,Spring Cloud Eureka作为注册中心, 所有的微服务都可以将自身注册到Spring Cloud Eureka进行统一的管理和访问(Eureka和Zookeeper不同,在AOP原则中选择了OP,更强调服务的有效性)

服务注册的概念早在微服务架构之前就出现了,微服务架构更是把原先的单一应用节点拆分成非常多的微服务节点。互相之间的调用关系会非常复杂,Spring Cloud Eureka作为注册中心, 所有的微服务都可以将自身注册到Spring Cloud Eureka进行统一的管理和访问(Eureka和Zookeeper不同,在AOP原则中选择了OP,更强调服务的有效性) [Image tex](http://blog.springcloud.cn/images/sc-lx/eureka.png)


[Image tex](http://blog.springcloud.cn/images/sc-lx/eureka_pic.png)

3.9 Spring cloud Zuul 服务端智能路由

当我们把所有的服务都注册到Eureka(服务注册中心)以后,就涉及到如何调用的问题。Spring Cloud Zuul是Spring Cloud提供的服务端代理组件,可以看做是网关,Zuul通过Eureka获取到可用的服务,通过映射配置,客户端通过访问Zuul来访问实际需要需要访问的服务。所有的服务通spring.application.name做标识,不同IP地址,相同spring.application.name就是一个服务集群。当我们增加一个相同spring.application.name的节点,Zuul通过和Eureka通信获取新增节点的信息实现智能路由,增加该类型服务的响应能力。

[Image tex](http://blog.springcloud.cn/images/sc-lx/zuul.png)

3.10 Spring cloud Ribbon 客户端智能路由

与Spring Cloud Zuul的服务端代理相对应,Spring Cloud Ribbon提供了客户端代理。在服务端代理中,客户端并不需要知道最终是哪个微服务节点为之提供服务,而客户端代理获取实质提供服务的节点,并选择一个进行服务调用。Ribbon和Zuul相似,也是通过和Eureka(服务注册中心)进行通信来实现客户端智能路由。

3.11 Spring cloud Sleuth 分布式追踪

[Image tex](http://blog.springcloud.cn/images/sc-lx/slueth.png)

2.12 Spring cloud Zipkin 调用链

[Image tex](http://blog.springcloud.cn/images/sc-lx/zipkin.png)


[Image tex](http://blog.springcloud.cn/images/sc-lx/zipkin_pic.png)

3.13 Spring cloud Feign http客户端

Spring Cloud Feign是一种声明式、模板化的http客户端。 使用Spring Cloud Feign请求远程服务时能够像调用本地方法一样,让开发者感觉不到这是远程方法(Feign集成了Ribbon做负载均衡)。

1.把远程服务和本地服务做映射

@FeignClient(name = "rabbitmq-http", url = "${SKYTRAIN_RABBITMQ_HTTP}")
   public interface TaskService {
       @RequestMapping(value = "/api/queues", method = RequestMethod.GET)
       public String query(@RequestHeader("Authorization") String token);
   }
  1. 以调用本地服务的方式调用远程服务
@Autowired
    private TaskService taskService;
    private String queryRabbitmqStringInfo() {
        byte[] credentials = Base64.encodeBase64((rabbitmqHttpUserName + ":" + rabbitmqHttpPassword).getBytes(StandardCharsets.UTF_8));
        String token = "Basic " + new String(credentials, StandardCharsets.UTF_8);
        return taskService.query(token);
    }

3.13 Spring cloud Hystrix 断路器

[Image tex](http://blog.springcloud.cn/images/sc-lx/hystrix.png)

四 自研组件

4.1 我们开发的几个微服务组件—应用管理中心

应用管理中心可以对每个已经注册的微服务节点进行停止,编译,打包,部署,启动的完整的上线操作。

[Image tex](http://blog.springcloud.cn/images/sc-lx/application.png)

4.2 我们开发的几个微服务组件—zookeeper数据查询中心

zookeeper数据查询中心根据zookeeper地址,端口,命令获取zookeeper数据信息。

[Image tex](http://blog.springcloud.cn/images/sc-lx/zookeeper.png)

4.3 我们开发的几个微服务组件—微服务健康检测中心

健康检测中心周期性检查每个微服务的状态,当发现有微服务状态处于DOWN或连接超时时,触发报警

健康检测中心周期性检查每个微服务的状态,当发现有微服务状态处于DOWN或连接超时时,触发报警 [Image tex](http://blog.springcloud.cn/images/sc-lx/health.png)

4.4 我们开发的几个微服务组件—定时任务查询中心

// 在BeanPostProcessor子类中拦截
   @Component
   public class SkytrainBeanPostProcessor implements BeanPostProcessor, Ordered {
       ***
       /**
        * Bean 实例化之后进行的处理
        */
       public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

           beanPostProcessor.postProcessAfter(bean, beanName);
           return bean;
       }

   }

   // 拦截后获取定时任务注解
   public Object postProcessAfter(Object bean, String beanName) {
       Class<?> targetClass = AopUtils.getTargetClass(bean);
       Map<Method, Set<Scheduled>> annotatedMethods = MethodIntrospector.selectMethods(targetClass,
               new MethodIntrospector.MetadataLookup<Set<Scheduled>>() {

                   public Set<Scheduled> inspect(Method method) {

                       Set<Scheduled> scheduledMethods = AnnotatedElementUtils.getMergedRepeatableAnnotations(method,
                               Scheduled.class, Schedules.class);
                       return (!scheduledMethods.isEmpty() ? scheduledMethods : null);
                   }
               });
       if (!annotatedMethods.isEmpty()) {
           String className = targetClass.getName();
           for (Map.Entry<Method, Set<Scheduled>> entry : annotatedMethods.entrySet()) {
               Method method = entry.getKey();
               for (Scheduled scheduled : entry.getValue()) {
                   String key = className + ":" + method.getName();
                   String value = scheduled.toString();
                   taskInfos.put(key, value);
               }
           }
       }
       return null;
   }

   // 获取定时任务后注册
   public void taskRegister() {
       String nodeInfo = ipAddress + ":" + serverPort + ":";
       try {
           /**
            * 定时任务
            */
           Map<String, String> infos = taskInfos;
           for (Entry<String, String> item : infos.entrySet()) {
               String taskId = nodeInfo + item.getKey();
               String taskParameter = item.getValue();
               JSONObject info = new JSONObject();
               info.put("taskId", taskId);
               info.put("taskParameter", taskParameter);
               info.put("applicationName", applicationName);
               info.put("taskType", "schedule");
               LOGGER.info(info.toString());
               zooKeeperExecutor.createZKNode(SKYTRAIN_TASK_ZKNODE_PREFIX + taskId, info.toString());
           }
       }
       catch (Exception ex) {
           LOGGER.error("", ex);
       }
   }

4.5 微服务的分类

4.6 整体微服务架构图

[Image tex](http://blog.springcloud.cn/images/sc-lx/all.png)

作者:宜信-技术研发中心-高级架构师-梁鑫

点我获取阿里云优惠券

我的官网http://guan2ye.com 我的CSDN地址http://blog.csdn.net/chenjianandiyi 我的简书地址http://www.jianshu.com/u/9b5d1921ce34 我的githubhttps://github.com/javanan 我的码云地址https://gitee.com/jamen/ 阿里云优惠券https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=9ytvzpwr

阿里云教程系列网站http://aliyun.guan2ye.com

1.png

我的开源项目spring boot 搭建的一个企业级快速开发脚手架

1.jpg

阿里云优惠券
我的github
我的码云