微服务架构的说明:

微服务的架构风格是将一个单体的应用程序开发拆解为一组"小"的服务,这里的"小"是以业务边界 来区分的,而不是根据代码的多少区分。每个服务都运行在一个单独的进程中,服务之间通过轻量级的方式进行通信,例如使用HTTP资源接口

单体架构与微服务架构的比较。

单体架构存在的问题:

  • 由于所有的业务逻辑都写在了一个应用service中,因此只要对该service进行修改,哪怕只是添 一行代码,也需要编译打包部署整个应用,需要的时间会比较久,耗时耗力。
  • 假设整个应用中只有一个接口到达了瓶颈,我们想要水平扩展该接口,这个时候只能通过水平扩展整个应用来达到目的。
  • 随着应用程序规模的增加,即使我们使用Maven进行模块化开发,也很难保证对于一个模块的修改不会影响其他模块。

为此,我们可以将整个应用切分为多个小的服务,将它们独立运行在自己的进程,当我们修改了一个服务的代码,那么只需要单独部署该服务即可,如果要扩展一个服务的接口,那么只扩展该服务就可以了。

微服务架构的缺点:

  • 由于整体应用的拆解,不可避免不同服务之间存在冗余的代码。例如,service1和service2中都编写了JedisCluster的工具类。
  • 维护一个应用程序简单,但是维护几十甚至几百个服务就很麻烦了,需要配备功底深厚的运维人员,也需要搭建完善的运维系统,例如,完善的计数监控系统,完善的日志系统及完善的链路跟踪系统等。
  • 服务众多,服务之间的调用也由原来的单体架构中的进程内调用变为了进程之间调用,这就需要考虑很多问题,例如使用什么通信方式,如何处理网络延迟及服务容错等问题。这是分布式系统都会存在的问题,但是在微服务架构中这些问题尤其严重,因为“分布”得非常厉害。
  • 如果从零开始搭建一套微服务系统,那么需要掌握的组件技术会比较多,从而开发的难度较大,开发周期会比较长。
  • 采用微服务架构就会涉及怎样将一个整体应用拆分成多个微服务,我们说了拆分的原则是根据业务拆分,但是这个业务边界有时候是比较难划分的。

微服务中的组件和技术选型

  1. 服务注册与发现

服务注册可以理解为将服务的ip和port注册到注册中心,这里可以简单的将注册中心理解为一个Map,其中的key是服务的唯一标识(可以是serviceId也可以是serviceName),而value是一个包含ipAndPort的结构体的集合,例如是一个List集合,该集合存放了指定service所在的所有服务器。

服务发现就是根据服务的唯一标识key,从注册中心获取指定服务所在的服务器列表,根据上述Map中的key来获取value。

使用服务注册和服务发现的好处很多,其中最主要的就是实现了服务之间的解稿。如果不使用服务注册中心,那么我们需要将被调用服务的服务器列表直接写在调用服务的配置文件中,这造成了两个服务的直接稿合。

  1. 健康检查

健康检查是检查两个东西是否处于正常状态:一个是服务所在服务器的运行状态;一个是服务本身的运行状态。健康检查的目的其实就是为了在服务发现和服务路由的时候,可以将服务的调用请求发送到处于健康状态的机器上。

常用的健康检查技术有Consul、Spring Boot的Actuator。

  1. 配置管理

配置管理主要做三件事。

  • 在一个地方将服务集中管理,例如在Consul-KV中集中配置,保护配置信息的安全。
  • 实现服务的配置与代码分离,这样修改配置信息后不需要再编译、打包、部署整个服务。
  • 实现热配置,当修改配置信息之后,不需要重启服务就可以自动获取修改后的配置信息。
  1. 服务通信

服务通信是指服务之间的相互调用。服务之间的调用协议可以使用TCP协议,也可以使用HTTP协议。通常用来实现服务通信的技术有Netty、Mina、Retrofit、OkHttp和AsyncHttpClient等。

  1. 服务路由

服务路由的过程是这样的:当一个请求过来时,通过服务发现和健康检查选出健康的服务器列表,之后采用一定的负载均衡策略(路由策略)从这些服务器中选出一台,最后将请求发送到这台服务器上去。

  1. 服务容错

服务容错指的是当服务集群中的一台机器岩机了,也不会导致整个服务不可用,甚至

不会因为级联失败导致多个服务不可用,形成雪崩。

参考技术: Hystrix。

  1. 日志系统

日志系统主要用于收集散落在各台机器上的日志,并提供高效的存储和查询方式,通过清晰易懂的界面进行结果展示。当然,也会提供方便的分析功能等。

参考技术: Logback、ELK、Redis、Flume、Hadoop、Kafka等。

  1. 全链路追踪系统

  2. 计数监控系统

  3. 文档输出

  4. 持续集成与持续部署系统

  5. 服务网关

  6. 服务编排


微服务基础架构

  1. 从Spring Boot开始

Application类中包含了一个main方法,作为入口。

注解@SpringBootApplication是一个复合注解,其包含了比较重要的注解有下面三个。

  • @SpringBootConfiguration该注解也是一个复合注解,其中最重要的注解是@Configuration,指明该类由Spring容器管理。
  • @EnableAutoConfiguration:该注解用于启动服务的自动配置功能。
  • @ComponentScan:该拄解用于扫描类,其作用类似于 Spring 中自<context: componentscan>标签。

再来看一个简单的controller。

该类非常简单,只提供了一个接口,并返回了一个String。该类使用了@RestController注解,该注解是一个复合注解,包含了@Controller@ResponseBody,指定controller返回的对象自动转化为json格式并返回,(基本类型及包装类、String除外)。

微服务文档输出

  1. Swagger概述

Swagger是一款可以用于设计、构建、文档化并且执行API的框架,使用该框架,可以轻松创建一个API文档。

  1. 如何使用Swagger
@SpringBootApplication
@EnableSwagger2 // 注解启动Swagger
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@ApiModel("用户模型")  // 指定一个POJO类作为注释
public class Blog {
@ApiModelProperty("ID") // 用来为POJO类中的属性做注解
private int id ;
@ApiModelProperty("TITLE")
private String title ;
@ApiModelProperty("内容")
private String disc ;
@ApiModelProperty("作者")
private String author ; // set,get等省略
}
@Api("user相关的api") // 为一个controller类做注释,说明该controller的职能
@RestController
public class BlogController {
@ApiOperation("根据ID获取用户信息") // 对该接口的注释,说明该controller的职能
@ApiImplicitParams({ // 通常用来包含接口的一组参数注解,可以将其简单地理解为参数注解的集合。
@ApiImplicitParam(paramType = "query" ,name = "id",dataType = "int",
required = true,value = "用户名的id",defaultValue = "1")
/*
paramType参数所放置的地方,包含query/header/path/body/form,最常用的是前4个。
需要注意的是query域中的值需要使用@RequestParam取,
header域中的值需要使用@RequestHeader获取,
path域中的值需要使用@PathVariable获取,
body域中的值需要使用@RequestBody获取,否则可能出错。 name,参数名。
dataType,参数类型。
required,参数是否必须传。
value,参数的值。
defaultValue,参数的默认值。
*/
})
@ApiResponses({ // 通常用来包含接口的一组响应注解,可以将其简单地理解为响应注解的集合。
@ApiResponse(code = 400,message = "请求参数没填好"),
@ApiResponse(code = 404,message = "请求路径没有或页面跳转路径不对")
// 用在@ApiResponses 中,一般用于表达一个错误的响应信息。
/*
code,即httpCode字,例如400。
message信息,例如"请求参数没填好"。
*/
})
@RequestMapping("/user")
public Blog blog(@RequestParam("id") int id){
if (id ==1) {
return new Blog(1,"a","b","c");
}
return new Blog(2,"d","e","f");
}
}

启动项目,打开http://localhost:8080/swagger-ui.html路径。

微服务数据库

2019-07-31-09:38


【笔记】Java微服务之路(持续更新)的更多相关文章

  1. .NET Core微服务之路:不断更新中的目录 (v0.43)

    原文:.NET Core微服务之路:不断更新中的目录 (v0.43) 微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑, ...

  2. .NET Core微服务之路:文章系列和内容索引汇总 (v0.52)

    微服务架构,对于从事JAVA架构的童鞋来说,早已不是什么新鲜的事儿,他们有鼎鼎大名的Spring Cloud这样的全家桶框架支撑,包含微服务核心组件如 1. Eureka:实现服务注册与发现. 2. ...

  3. Java微服务 vs Go微服务,究竟谁更强!?

    前言 Java微服务能像Go微服务一样快吗? 这是我最近一直在思索地一个问题. 去年8月份的the Oracle Groundbreakers Tour 2020 LATAM大会上,Mark Nels ...

  4. 现如今,最热门的13个Java微服务框架

    曾经的 服务器领域 有许多不同的芯片架构???有哪些芯片架构???和操作系统???,经过长期发展,Java的“一次编译,到处运行”使得它在服务器领域找到一席之地,成为程序员们的最爱. 本文,我们将和大 ...

  5. 深入理解Java虚拟机--个人总结(持续更新)

    深入理解Java虚拟机--个人总结(持续更新) 每天按照书本学一点,会把自己的总结思考写下来,形成输出,持续更新,立帖为证 -- 2020年7月7日 开始第一次学习 -- 2020年7月8日 今天在百 ...

  6. 多云架构下,JAVA微服务技术选型实例解析

    [摘要] 本文介绍了基于开源自建和适配云厂商开发框架两种构建多云架构的思路,以及这些思路的优缺点. 微服务生态 微服务生态本质上是一种微服务架构模式的实现,包括微服务开发SDK,以及微服务基础设施. ...

  7. 从成本角度看Java微服务

    近年来,微服务因其良好的灵活性和伸缩性等特点备受追捧,很多公司开始采用微服务架构或将已有的单体系统改造成微服务.IBM也于近日开源了轻量级Java微服务应用服务器 Open Liberty .但是采用 ...

  8. Java微服务对UTC时间格式的处理

    一.背景 先说一下为什么要使用UTC时间.开发一个全球化的系统,服务端(Java微服务)集中部署在同一个地方,用户在全球通过浏览器.手机客户端访问.不同地区的时区是不一样的,同一个时间戳,不同的用户看 ...

  9. MOT上海站 | 卓越研发之路:微服务之路

    微服务架构在带来灵活性.扩展性.可用性等优点的同时,其复杂性也给架构师们带来了很大的挑战.当你面对这些挑战一筹莫展时,不妨来参加由msup和微软联合推出的MOT线下沙龙活动吧,我们将给您答疑解惑. M ...

随机推荐

  1. 通过yum在centos安装mysql并配置远程登录

    前言 前天按照Oracle上的文档装了一遍mysql,选了最新8.0的版本,后来出现一些问题,网上搜答案,出来的基本还是5.x版本的解决方案,并不适用8.0版本.然后我就去看了一下公司的正式环境买的阿 ...

  2. IT兄弟连 HTML5教程 HTML5的基本语法 了解Web

    HTML也是计算机编程语言,但由于功能简单易用,不涉及业务逻辑,算是编程语言中最简单的了.其实学习HTML这门语言,就是在学习一个个HTML标记的使用,标记的名称和使用不是自定义的,它的功能及用法是已 ...

  3. IT兄弟连 Java语法教程 关系运算符

    关系运算符用来判定一个操作数与另外一个操作数之间的关系.特别是,它们可以判定相等和排序关系.表7中列出了关系运算符. 表7  关系运算符 关系运算符的结果为布尔值.关系运算符最常用与if语句和各种循环 ...

  4. Java设计模式:Factory Method(工厂方法)模式

    概念定义 工厂方法(Factory Method)模式,又称多态工厂(Polymorphic Factory)模式或虚拟构造器(Virtual Constructor)模式.工厂方法模式通过定义工厂抽 ...

  5. .net 调用C++ dll

    .net C#调用C++ dll 主要分为以下的步骤 1.加载dll [DllImport("CallOtherLanguage.dll", EntryPoint = " ...

  6. JavaWeb之动态代理解决request请求编码问题

    动态代理解决编码问题 1.设计模式 出现原因:软件开发过程中,遇到相似问题,将问题的解决方法抽取模型(套路) 常见设计模式:单例,工厂,适配器,装饰者,动态代理. 2.装饰者模式简单介绍 谷歌汽车开发 ...

  7. 用css做三角形

    <html> <body> <style> .trlangle{ width: 0; height: 0; border-left: 50px solid tran ...

  8. QT5.5+VS2013编译安装QtCharts (ZZ)

    环境 1.Windows 10 -x64: 2.MSVC 2013 -x64: 3.Qt5.5.1 -x86 and -x64. 编译过程 准备工作 1.安装ActivePerl 安装过程同一般软件安 ...

  9. HTTP协议解析之Cookie

    " Cookie与身份认证." 提到HTTP协议,不可避免地都会牵涉到Cookie,可以说,Cookie作为HTTP的重要组成部分,促进了HTTP协议的发展壮大. HTTP协议如果 ...

  10. docker系列(三):docker容器

    1 引言 在前面博文中,我们介绍了镜像.如果说镜像犹如面向对象中的类,本节要说的容器就是由类实例化出来的对象了,有了类才可以创建容器. 先从拉取一个官方提供的ubuntu最新镜像: $ docker ...