【微服务】使用spring cloud搭建微服务框架,整理学习资料

写在前面

  使用spring cloud搭建微服务框架,是我最近最主要的工做之一,一开始我使用bubbo加zookeeper制做了一个基于dubbo的微服务框架,而后被架构师否了,架构师曰:此物过期。随即,我上一套spring cloud,与公司大环境框架一致,也废了很多功夫,如今在这里分享基础结构给各位博友,若有不对的地方,欢迎你们直接评论区怂我。嘿嘿。php

   后续的代码已传至个人github,你们能够下载查看。html

  下载文件地址 前端

微服务

 

  首先咱们要了解什么是微服务,以及微服务的做用,咱们才可以顺利的搭建一个微服务架构。git

  博主先用一句话总结什么是微服务。程序员

  微服务就是对某个应用系统的每一个API进行有效的拆分,而后经过某种链接方式,用以提供给其余应用系统调用的API的服务,在调用过程当中实现和解决了一系列问题的综合就是微服务架构github

 

  顾名思义,微服务得从两个方面去理解,什么是"微"、什么是"服务"。spring

  编程

  简单的讲就是体积小,随处运行,开发简单。传统的spring mvc框架配置繁杂,项目依赖杂乱,经常令开发和维护头疼不已。springboot

  服务  服务器

  所谓服务,必定要区别于系统,服务一个或者一组相对较小且独立的功能单元,是用户能够感知最小功能集。

  微服务最先由Martin Fowler与James Lewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每一个服务运行在本身的进程中,并使用轻量级机制通讯,一般是HTTP API,这些服务基于业务能力构建,并可以经过自动化部署机制来独立部署,这些服务使用不一样的编程语言实现,以及不一样数据存储技术,并保持最低限度的集中式管理。

  应用的拆分

  有程序员A,B,C,他们如今都须要开发一套订单管理系统。

  程序员A采用单系统架构,业务代码作mvc拆分,前端部分使用php作渲染层。 

  程序员B采用多应用架构,将产品、订单、物流、工单、客服等作应用级拆分,而后使用REST API或者tcp直接交互,每一个应用都是一个mvc系统,独立开发。

  程序员C采用微服务,将产品、订单、物流、工单、客服等作应用级拆分,再使用微服务框架将他们打散拆分红一个个的服务,例如订单列表查询服务、产品列表查询服务、产品详情查询服务等。使用一个个服务组成应用系统而后整合为订单管理系统

  毫无疑问,程序员A的架构方式只可以在订单量小,吃了上顿没下顿的公司应用了。

  而程序员B的架构相似大部分电商平台前期的架构逻辑,这套架构适应能力不错,可是随着系统的不断扩大,维护变的极为复杂,版本的更替,应用之间的API调用随着各类各样的需求复杂多变。

  随着B架构的演变,诞生了程序员C的架构模式,微服务。微服务的理解就是将相似 订单列表查询服务、产品列表查询服务、产品详情查询服务进行细分,微分。使咱们的代码可以经过统一的网关进行整合,可以让整个公司的系统开发力量完全整合起来,而且微服务中的服务治理、熔断、负载均衡等等功能增强了对整个系统的治理能力。

  目前应对中大型站点的后台架构,微服务是最适合的一套模式。同时spring boot的出现让微服务的开发变得更简单,理解更容易,例如dubbo的开发方式其实比较简单、易懂,spring cloud更是深度整合spring boot的能力,借用网友的一张对比图:

图出处:https://blog.csdn.net/zhouyanqingbfq/article/details/79407285

另外有不少关于微服务的知识理念,博主整理了一些:

  https://blog.csdn.net/fly_zhyu/article/details/76408158

  https://www.cnblogs.com/wintersun/p/6219259.html

  

spring boot

   Spring Boot不是一门新技术,因此不用紧张。从本质上来讲,Spring Boot就是Spring,它作了那些没有它你也会去作的Spring Bean配置。它使用“习惯优于配置”(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来。使用Spring Boot很容易建立一个独立运行(运行jar,内嵌Servlet容器)、准生产级别的基于Spring框架的项目,使用Spring Boot你能够不用或者只须要不多的Spring配置。

  这一部分博主再也不追述,提供一些资料你们看看就好,能点进这篇博文的人这里默认你会一些的吧。

    【转】Spring Boot干货系列:(一)优雅的入门篇

 

spring cloud

  Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer's own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.

  spring cloud 提供一些工具迅速构建一些经常使用模式的分布式系统(例如 配置管理,服务发现,断路器,路由,微代理,控制总线,token,全局锁,分布式sessions,cluster state),使用Spring Cloud开发人员能够快速站出实现这些模式的服务和应用程序。 他们能够在任何分布式环境中运行良好,包括开发人员本身的笔记本电脑,裸机数据中心和托管平台,如Cloud Foundry。

  来自spring cloud 官网的第一句介绍,spring cloud提供了一系列的工具去构建一套分布式系统,这些工具共同组成了一个微服务架构系统,注册中心、网关、provider、consumer、Rest、分布式锁、分布式session等等功能。

  spring cloud的学习资料整理:

   http://www.ityouknow.com/springcloud/2016/12/30/springcloud-collect.html     

  https://blog.csdn.net/forezp/article/details/70148833

注册中心

   eureka注册中心的搭建 博主使用IDEA搭建

  1首先建立一个空的maven项目

  

  填入参数:

    

  

  finish就ok

  

  finish后删除目录下src文件夹

  

  

  2.而后在cloud中新建module,右键根目录,选择new》module  

  

 

  新建一个spring boot项目,并添加上eureka依赖

  

 

 

注意content root的地址,在cloudDemo目录下的erueka

 

点击finish,就生成了一个springboot项目,等待maven初始化完毕,此时的项目结构,和eureka的pom文件以下:

  

 

 

 启动eureka注册中心的方式很简单,在springboot的启动类上加上注解

@EnableEurekaServer

 

  而后配置咱们的spring boot启动:

  将resource下面的 application.properties文件改成application.yml文件并添加以下配置:

server:
  port: 8801

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

而后启动项目访问localhost:8801,看到这个界面,Eureka注册中心就已经启动成功,接下来咱们能够编写一个提供者,一个消费者。

 

 spring cloud的消费者也能够是提供者,两者只有逻辑上的区别,它是链式的存在。在spring boot中有两种消费方式:

 1.rest+ribbon

 2.Feign

接下来咱们编写消费者

rest+ribbon消费

   首先保持Eureka的启动不变,而后在cloudDemo下新建一个module 叫作ribbon,它也是spring boot结构:

  

  

  

  注意咱们要添加三个依赖,如上图红框依次选择便可。

  

  同样,要注意content root的目录。

  建立完成后,编写springboot的启动类,首先加上 @ComponentScan 注解,而后添加 @EnableDiscoveryClient 注册服务,而后注入RestTemplate对象,

 @LoadBalanced 表示开启负载均衡

  完整的代码以下:

@SpringBootApplication
@EnableDiscoveryClient //注册服务
@ComponentScan
public class RibbonApplication {

    public static void main(String[] args) {

        SpringApplication.run(RibbonApplication.class, args);
    }
@Bean @Autowired @LoadBalanced RestTemplate restTemplate(){
return new RestTemplate(); } }

  而后咱们建立一个测试用的service文件:

  

  

  代码以下:

@Service
public class HelloService {
    public String sayHello(){
        return "helloWorld"; // 提供一个hello World
    }
}

而后咱们再编写一个controller,提供一个hello的controller:

完整代码以下:

@RestController
public class HelloController {
    @Autowired
    private HelloService helloService;
    @GetMapping("/hello")
    public String sayHello(String name){
        return helloService.sayHello() + " " + name;
    }
}

 

 而后咱们再配置application.yml , 同样的 将配置文件改成yml格式,而后输入配置:

  

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8801/eureka/
server:
  port: 8802
spring:
  application:
    name: ribbon-provider

以后启动服务,启动后访问 localhost:8802/hello?name=zhangtaifeng :

  

测试完成,这个服务咱们用他作服务提供者(provider),而后咱们再从新建一个module,能够叫作 ribbon-consumer,总体配置一致,咱们只须要修改service和controller部分(注意package):

 

而后修改配置文件为:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8801/eureka/
server:
  port: 8803
spring:
  application:
    name: ribbon-consumer

改了端口和应用名称。

 

 

 而后复制上面的spring boot入口文件代码,复制service和controller文件,依然 注意包名和路径,而后修改HelloService:

咱们启动应用看看:

  

RestTemplate成功调用了8802端口上的provider。

到了这里,相信你们对spring cloud调用服务有了必定的了解,cloud经过rest调用服务进行服务间的通讯,每个controller的方法对外提供对应的服务接口。相比较dubbo的rpc调用有一些不同的优点,同时它的开发方式更简单,配合zuul网关的使用可以达到更好的效果。

Feign消费

 feign消费是经过注解的方式进行的消费模式,它默认打开了负载均衡,仍是在cloudDemo下建立一个module,名字叫feign:

  

 

 

注意引用的包。

建立完成,首先编写入口文件,主要是加上

@EnableDiscoveryClient
@EnableFeignClients

  这两个注解,用于注册和发现服务。

  

而后咱们在目录下新建一个service,controller,或者从前面的工程复制,另外须要新建一个rpc文件夹,而后在rpc下新建一个GetHello接口:

  

 

编写访问rpc的方法,使用feign调用更加简便,添加@FeignClient注解便可,value的意思就是目标服务器,能够直接用yml中配置的application名称,完整代码以下:

@FeignClient(value = "ribbon-consumer")
public interface GetHello {
    @RequestMapping(value = "/hello?name=feign",method = RequestMethod.GET)
    public String sayHello();
}

而后再改造下service代码:

@Service
public class HelloService {
    @Autowired
    private GetHello getHello; //注入rpc

    public String sayHello(){
        return getHello.sayHello(); // 提供一个hello World
    }
}

最后仍是修改application.yml文件,配置大体相同,修改应用名和端口,代码以下:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8801/eureka/
server:
  port: 8804
spring:
  application:
    name: feign-consumer

而后咱们启动这个工程看看有什么效果,注意,这全部的步骤,前面的服务都没有关闭噢:

 

启动后效果如图。

 

 

小结

  代码已传至个人github,你们能够下载查看。

  下载文件地址 

  从这里看,spring cloud将咱们的几个应用串联起来,各个服务之间互相经过restAPI调用,我以为Feign要优于ribbon,另外Eureka注册中心也能够换成zookeeper或者consul,我目前使用consul。

  spring cloud东西很是多,慢慢看,你们一块儿进步,谢谢。

  有什么问题你们评论区多多交流。

相关文章
相关标签/搜索