zoukankan      html  css  js  c++  java
  • 一步一步搭建springCloud

    一、spring cloud简介
    Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

    1.1什么是分布式
    不同模块部署在不同服务器上
    作用:分布式解决网站高并发带来问题
    
    1.2什么是集群
    多台服务器部署相同应用构成一个集群
    作用:通过负载均衡设备共同对外提供服务
    
    1.3什么是RPC
    RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。
    它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即无论是调用本地接口/服务的还是远程的接口/服务,本质上编写的调用代码基本相同。
    比如两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数或者方法,由于不在一个内存空间,不能直接调用,这时候需要通过就可以应用RPC框架的实现来解决
    
    1.3.1restful、soap、rpc
    (1)RESTful是一种架构设计风格,提供了设计原则和约束条件,而不是架构。而满足这些约束条件和原则的应用程序或设计就是 RESTful架构或服务。
    (2)SOAP,简单对象访问协议是一种数据交换协议规范,
    是一种轻量的、简单的、基于XML的协议的规范。SOAP协议和HTTP协议一样,都是底层的通信协议,只是请求包的格式不同而已,SOAP包是XML格式的。
    SOAP的消息是基于xml并封装成了符合http协议,因此,它符合任何路由器、 防火墙或代理服务器的要求。
    soap可以使用任何语言来完成,只要发送正确的soap请求即可,基于soap的服务可以在任何平台无需修改即可正常使用。
    (3)RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
    RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)
    RPC 是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式)
    RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。
    1.3.2rpc远程调用框架
    几种比较典型的RPC的实现和调用框架。 
    (1)RMI实现,利用java.rmi包实现,基于Java远程方法协议(Java Remote Method Protocol) 
    和java的原生序列化。 
    (2)Hessian,是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 基于HTTP协议,采用二进制编解码。 
    (3)thrift是一种可伸缩的跨语言服务的软件框架。thrift允许你定义一个描述文件,描述数据类型和服务接口。依据该文件,编译器方便地生成RPC客户端和服务器通信代码。
    (4)SpringCloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。
    
    1.4什么是SOA
    业务系统分解为多个组件,让每个组件都独立提供离散,自治,可复用的服务能力
    通过服务的组合和编排来实现上层的业务流程
    作用:简化维护,降低整体风险,伸缩灵活
    
    1.5什么是微服务
    架构设计概念,各服务间隔离(分布式也是隔离),自治(分布式依赖整体组合)其它特性(单一职责,边界,异步通信,独立部署)是分布式概念的跟严格执行
     SOA到微服务架构的演进过程
     作用:各服务可独立应用,组合服务也可系统应用(巨石应用[monolith]的简化实现策略-平台思想)
    
    1.6使用RPC http技术实现会员与订单系统通讯

    二、创建服务注册中心
    我们需要用的的组件上Spring Cloud Netflix的Eureka ,eureka是一个服务注册和发现模块。

    1、创建一个web-app的maven工程。此处命名为:springcloud

    2、在该工程下创建module。

     

    选择springboot的快速创建。

     

    勾上Eureka Server。以便自动导入包

     

    3、可以检查一下pom文件,这里的依赖如下:

    <dependencies>
    
    <!--eureka server -->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
    <version>1.4.2.RELEASE</version>
    </dependency>
    
    <!-- spring boot test-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    </dependency>
    
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
    </dependencies>

    4、在application中加入注解@EnableEurekaServer,申明此处为服务注册中心。

     

    5、yml中的加入如下配置:registerWithEureka 和 fetchRegistry 设置为false,表明自己属于服务中心主体

    server:
    port: 8761
    
    eureka:
    instance:
    hostname: localhost
    client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
    defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

    6、启动服务,登陆浏览器查看。http://localhost:8761/

    红框内为已经注册的服务。这里我们只有服务中心,没有写生产者,所以红框中的内容应该是空。

     


    三、创建生产者
    创建的过程如server一样即可。

    1、创建完成之后检查一下pom文件,这里提供依赖如下:

    <dependencies>
    
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-eureka</artifactId>
      <version>1.4.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    </dependencies>

     2、在application中加入注解@EnableEurekaClient,表明自己属于一个生产者。

    这里为了方便测试,直接使用@RestController获取返回值。

    @SpringBootApplication
    @EnableEurekaClient
    @RestController
    public class ServiceHiApplication{
    public static void main(String[] args){
      SpringApplication.run(ServiceHiApplication.class, args);
    }
    
    @Value("${server.port}")
    String port;
    
    @RequestMapping("/hi")
    public String home(@RequestParam String name){
      return "hi " + name + ",i am from port:" + port;
    }
    }

    3、yml配置

    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/
    server:
      port: 8763
    spring:
      application:
        name: service-hi


    端口不能与上面的相同。这里的服务name:service-hi 可以根据自己情况定义。

    4、运行服务,登陆环境 http://localhost:8765/hi?name=fys

    可以看到如下信息。这里用postman进行测试:

     

    在8761这个端口中,也能看到,该信息已经在服务中心进行了注册。名字为我们yml中进行配置的名字。

     

    三、创建消费者
    1.1 方式一:服务消费者(rest+ribbon)
    1、创建消费者modul,流程如上述工程创建流程。
    2、引入pom依赖

    断路器依赖在此章节中可以不需要引入。

    <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
    
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    
    
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-eureka</artifactId>
      <version>1.4.4.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-ribbon</artifactId>
      <version>1.4.2.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!--断路器-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-hystrix</artifactId>
      <version>1.4.4.RELEASE</version>
    </dependency>
    
    </dependencies>

    3、yml配置

    在工程的配置文件指定服务的注册中心地址为http://localhost:8761/eureka/ 。

    eureka:
        client:
            serviceUrl:
                defaultZone: http://localhost:8761/eureka/
    server:
        port: 8764
    spring:
        application:
            name: service-ribbon                


    4、application中加入注解:@EnableDiscoveryClient并且加入restTemplate以消费相关的服务。

    @SpringBootApplication
    @EnableDiscoveryClient
    public class ServiceRibbonApplication{
      public static void main(String[] args){
        SpringApplication.run(ServiceRibbonApplication.class, args);
    }
    
      @Bean
      @LoadBalanced
      RestTemplate restTemplate(){
        return new RestTemplate();
      }
    }

    5、创建service和controller。

    @RestController
    public class HelloControler{
    
    @Autowired
    HelloService helloService;
    
    @RequestMapping(value = "/hi")
    public String hi(@RequestParam String name){
      return helloService.hiService(name);
    }
    }
    @Service
    public class HelloService{
    @Autowired
    RestTemplate restTemplate;
    
    public String hiService(String name){
      return restTemplate.getForObject("http://SERVICE-HI/hi?name=" + name, String.class);
    }
    }

    这里利用字符串进行传输。当然restTemplate也是可以以对象进行传输的。

    例如:

    service-hi中的返回如下:

     

    调用界面如下。

     

    可以看到,都是能成功获取到相关的返回内容。这里用object的封装是为了方法的通用性。(这里key值如果为数字,只测试过字符串的数字,会引起报错。有兴趣的可以进一步研究)。

    测试结果如下:

     

    6、增加断路器

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。为了解决这个问题,业界提出了断路器模型。

    Netflix开源了Hystrix组件,实现了断路器模式,SpringCloud对这一组件进行了整合。 在微服务架构中,一个请求需要调用多个服务是非常常见的,如下图:

     

    较底层的服务如果出现故障,会导致连锁故障。当对特定的服务的调用的不可用达到一个阀值(Hystric 是5秒20次) 断路器将会被打开。

     

    断路打开后,可用避免连锁故障,fallback方法可以直接返回一个固定值。

    首先。需要引入断路器的pom依赖:

    <!--断路器-->
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
    <version>1.4.4.RELEASE</version>
    </dependency>
    在application中增加@EnableHystrix注解表示开启断路器

    在上一小节基础上增加断路器所需的fallback方法:

    代码如下:

    @Service
    public class HelloService
    {
    
    @Autowired
    RestTemplate restTemplate;
    
    // 断路器配置,当无法调用如下方法时,就会调用自定的hiError方法。
    @HystrixCommand(fallbackMethod = "hiError")
    public String hiService(String name)
    {
    // ResponseEntity<Object> forEntity = restTemplate.getForEntity("http://SERVICE-HI/hi?name=" + name, Object.class);
    Object forObject = restTemplate.getForObject("http://SERVICE-HI/hi?name=" + name, Object.class);
    return forObject.toString();
    }
    
    public String hiError(String name)
    {
    return "hey " +
    name + ", there is some problem with hi page";
    }
    }

    完成上述工作后,将service-hi服务关闭,调用service-ribbon 的hi方法。可以看到hiError的输出结果。

     

    ---------------------
    作者:封玉书
    来源:CSDN
    原文:https://blog.csdn.net/zhou199252/article/details/80745151
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    HDU4529 郑厂长系列故事——N骑士问题 —— 状压DP
    POJ1185 炮兵阵地 —— 状压DP
    BZOJ1415 聪聪和可可 —— 期望 记忆化搜索
    TopCoder SRM420 Div1 RedIsGood —— 期望
    LightOJ
    LightOJ
    后缀数组小结
    URAL
    POJ3581 Sequence —— 后缀数组
    hdu 5269 ZYB loves Xor I
  • 原文地址:https://www.cnblogs.com/lc0605/p/10032655.html
Copyright © 2011-2022 走看看