微服务简介

1. 什么是微服务

在介绍微服务时,首先得先理解什么是微服务,顾名思义,微服务得从两个方面去理解,什么是”微”、什么是”服务”,微,狭义来讲就是体积小, 而所谓服务,一定要区别于系统,服务一个或者一组相对较小且独立的功能单元,是用户可以感知最小功能集。
本质是:解耦,适度解耦。

2. 微服务由来

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

3. 关于Netflix的贡献

在微服务的架构中,Martin Flower 的文章中肯定了Netflix的贡献,接下来我们了解一下Netflix

  • Netflix OSS
    Netflix(Nasdaq NFLX) 成立于1997年,是一家在线影片租赁提供商,主要提供Netflix超大数量的DVD并免费递送,总部位于美国加利福尼亚州洛斯盖图
    Netflix OSS 指的是 “Netflix Open Source Software”
    这里我们关注的是 OSS 中的cloud platform, 也就是 “Common Runtime Services & Libraries”,包括为微服务提供支持的运行时容器,类库和服务。
    Netflix OSS 是一组开源的框架和组件库,是Netflix公司开发出来解决分布式系统的一些有趣的可扩展类库。对于Java开发者来说,它们是在云端环境中开发微服务的非常棒的工具代名词。在服务发现,负载均衡,容错等模式方面,都给出了非常重要的概念,并带来了漂亮的解决方案。

    4.Sring Cloud 与 Netflix

    Spring Cloud 并不是一个具体的框架,而是一个统一的框架集,可以理解为一个工具箱,提供了各种工具,可以帮助我们快速构建分布式系统
    Spring Cloud 项目的构建基于Spring Boot,不了解Spring Boot的可以先熟悉一下Spring Boot。Spring Cloud 团队讲Netflix的多个框架进行封装并不断迭代,通过自动配置的方式将这些框架绑定到Spring的环境中。从而简化了框架的使用。使得我们在使用Spring Cloud时很容易将Netflix各个框架包含在项目中。下面介绍下封装了Netflix的那些内容:

  • Eureka:Spring Cloud微服务的注册中心,主要用于服务管理(虽说)
    目前Eureka官方已经不再维护,但也不影响我们使用,Spring Cloud 切换到Consul、Zookeeper也含简单,进阶部分会说到。

  • Hystrix:自我保护框架,通过限流、熔断控制分布式系统建的交流
  • Feign:一个基于REST的客户端,目的为了简化Web Service客户端的开发
  • Ribbon:负载均衡框架,支持按照权重、随机、轮询等
  • Zuul:Spring Cloud 微服务网关,为微服务提供代理、过滤、路由等功能

    5.Spring Cloud 其它重要模块

  • Spring Cloud Stream

  • Spring Cloud Bus
  • Spring Cloud Config

后续入门和进阶都是提到
SpringCloud官方:https://spring.io/projects/spring-cloud

准备工作

1.环境准备

工具 版本
jdk 1.8
maven 3.5.2
git 2.24.0.2
开发工具idea 2019.2.4
lombok idea插件

idea推荐使用正版,也可以用免费的社区版

Spring Boot快速入门

1.Spring Boot 简介

  • Spring Boot使您可以轻松地创建独立的、生产级的、基于Spring的应用程序,使用构建工具引入需要的依赖包,项目即可运行,大多数Spring应用程序只需要很少的Spring配置。
  • Spring Boot 的配置方式和之前的Spring 是有区别的,Spring Boot 不需要写xml的配置,采用Java配置方式就是使用Java类来替代Spring原先的xml文件
  • Spring Boot 支持Maven 和 Gradle 这两款构建工具。Gradle使用Groovy语言进行构建。与Maven、Ant等构建工具有良好的兼容性。因大部分对Maven比较熟悉,本书已Maven作为项目的构建工具

    2.新建项目

    新建项目可以基于自己的工具idea、ecplsie新建,也可以基于Spring提供的https://start.spring.io/进行构建。

    2.1基于https://start.spring.io/构建

    浏览器输入网址https://start.spring.io/
    Spring Cloud开发微服务应用 - 图1
    比如我依赖了Lombok(可不用写getter setter)
    Spring Cloud开发微服务应用 - 图2
    点击generator即可下载
    Spring Cloud开发微服务应用 - 图3
    导入到开发工具即可,缺点是只有目前最新的Spring Boot 版本
    Spring Cloud开发微服务应用 - 图4

    2.2使用idea构建

    点击File->new->project选择Maven
    Spring Cloud开发微服务应用 - 图5
    点击Next,输入项目信息
    Spring Cloud开发微服务应用 - 图6
    点击Next
    Spring Cloud开发微服务应用 - 图7
    点击Finish,选择This WindowNew Window 均可
    Spring Cloud开发微服务应用 - 图8
    为了方便大家课后阅读源码,我将Spring Boot 的示例项目健在fw-spring-cloud这个聚合工程里面

    2.4 Spring Boo项目配置

    新建项目中,在src/mian/java 放置的是Java文件,src/main/resources放置的是项目的资源文件,src/test 则放置的是测试相关的Java文件和资源文件。

    2.4.1 pom 文件配置

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <parent>
    6. <artifactId>fw-sping-cloud</artifactId>
    7. <groupId>com.yisu.cloud</groupId>
    8. <version>1.0-SNAPSHOT</version>
    9. </parent>
    10. <modelVersion>4.0.0</modelVersion>
    11. <artifactId>fw-cloud-springboot</artifactId>
    12. <dependencies>
    13. <dependency>
    14. <groupId>org.springframework.boot</groupId>
    15. <artifactId>spring-boot-starter-web</artifactId>
    16. </dependency>
    17. </dependencies>
    18. </project>

    配置完成之后,改以来会自动帮我们项目置为可启动服务,启动代码如下:

    1. @SpringBootApplication
    2. public class FwBootApplication {
    3. public static void main(String[] args) {
    4. SpringApplication.run(FwBootApplication.class, args);
    5. }
    6. }

    项目中必须添加 @SpringBootApplication注解,声明了这是一个启动类,并且@SpringBootApplication已经为我们集成了很多注解

    1. @Target({ElementType.TYPE})
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. @Inherited
    5. @SpringBootConfiguration
    6. @EnableAutoConfiguration
    7. @ComponentScan(
    8. excludeFilters = {@Filter(
    9. type = FilterType.CUSTOM,
    10. classes = {TypeExcludeFilter.class}
    11. ), @Filter(
    12. type = FilterType.CUSTOM,
    13. classes = {AutoConfigurationExcludeFilter.class}
    14. )}
    15. )
    16. public @interface SpringBootApplication

    点击右键启动
    Spring Cloud开发微服务应用 - 图9
    默认没有配置文件的情况下,启动的端口是8080
    Spring Cloud开发微服务应用 - 图10
    现在我们修改配置,端修改口,在src/main/resources 下添加application.yml 文件或 application.properties文件
    以下是application.yml的形式,格式化后比较清晰

    1. server:
    2. port: 8773

    application.properties形式如下

    1. server.port= 8773

    我个人喜欢yml的配置文件,在配置文件比较多的时候比较清晰。

    2.4.2新建接口

    1. /**
    2. * @author xuyisu
    3. * @description hello
    4. * @date 2019/12/13
    5. */
    6. @RestController
    7. public class HelloController {
    8. @GetMapping("/hello")
    9. public String hello(String name){
    10. return "hello:"+name;
    11. }
    12. }

    这是一个简单的RESTFUL形式的接口,@RestController可以是返回的数据默认是JSON形式的,@RestController中主要将内容转成JSON的是@ResponseBody

    1. @Target({ElementType.TYPE})
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. @Controller
    5. @ResponseBody

    如果使用的是@Controller就需要手动在需要返回JSON的接口上加上@ResponBody,如果不加,返回就是对应的View(页面试图)

    另外说明一下@GetMapping等注解

  • 如果设置的是@RequestMapping注解,默认支持get、post、put、delete请求

  • @GetMapping只支持get请求
  • @PostMapping 只支持post请求 可用来增删改查的接口设计
  • @PutMapping 常用来作为RESTFUL的新增请求接口
  • @DeleteMapping 常用来作为RESTFUL的删除请求接口
    重新启动项目测一下接口,postman 输入接口
    Spring Cloud开发微服务应用 - 图11