微服务简介
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/
比如我依赖了Lombok(可不用写getter setter)
点击generator即可下载
导入到开发工具即可,缺点是只有目前最新的Spring Boot 版本
2.2使用idea构建
点击File->new->project选择Maven
点击Next,输入项目信息
点击Next
点击Finish,选择This Window 或 New Window 均可
为了方便大家课后阅读源码,我将Spring Boot 的示例项目健在fw-spring-cloud这个聚合工程里面2.4 Spring Boo项目配置
新建项目中,在src/mian/java 放置的是Java文件,src/main/resources放置的是项目的资源文件,src/test 则放置的是测试相关的Java文件和资源文件。
2.4.1 pom 文件配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>fw-sping-cloud</artifactId>
<groupId>com.yisu.cloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>fw-cloud-springboot</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
配置完成之后,改以来会自动帮我们项目置为可启动服务,启动代码如下:
@SpringBootApplication
public class FwBootApplication {
public static void main(String[] args) {
SpringApplication.run(FwBootApplication.class, args);
}
}
项目中必须添加 @SpringBootApplication注解,声明了这是一个启动类,并且@SpringBootApplication已经为我们集成了很多注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication
点击右键启动
默认没有配置文件的情况下,启动的端口是8080
现在我们修改配置,端修改口,在src/main/resources
下添加application.yml 文件或 application.properties文件
以下是application.yml的形式,格式化后比较清晰server:
port: 8773
application.properties形式如下
server.port= 8773
我个人喜欢yml的配置文件,在配置文件比较多的时候比较清晰。
2.4.2新建接口
/**
* @author xuyisu
* @description hello
* @date 2019/12/13
*/
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(String name){
return "hello:"+name;
}
}
这是一个简单的RESTFUL形式的接口,@RestController可以是返回的数据默认是JSON形式的,@RestController中主要将内容转成JSON的是@ResponseBody
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
如果使用的是@Controller就需要手动在需要返回JSON的接口上加上@ResponBody,如果不加,返回就是对应的View(页面试图)
另外说明一下@GetMapping等注解
如果设置的是@RequestMapping注解,默认支持get、post、put、delete请求
- @GetMapping只支持get请求
- @PostMapping 只支持post请求 可用来增删改查的接口设计
- @PutMapping 常用来作为RESTFUL的新增请求接口
- @DeleteMapping 常用来作为RESTFUL的删除请求接口
重新启动项目测一下接口,postman 输入接口