引言

微服务架构是一项在云中部署应用和服务的新技术。大部分围绕微服务的争论都集中在容器或其他技术是否能很好的实施微服务,而红帽说API应该是重点。

微服务可以在“自己的程序”中运行,并通过“轻量级设备与HTTP型API进行沟通”。关键在于该服务可以在自己的程序中运行。通过这一点我们就可以将服务公开与微服务架构(在现有系统中分布一个API)区分开来。在服务公开中,许多服务都可以被内部独立进程所限制。如果其中任何一个服务需要增加某种功能,那么就必须缩小进程范围。在微服务架构中,只需要在特定的某种服务中增加所需功能,而不影响整体进程。

实践微服务架构全方位的技术

这仅仅是spring-cloud微服务框架的一个demo,可以完整运行。可能你初看到这里,会觉得这个项目目录太tm复杂了,确实,微服务要做的就是解耦、轻量化。这里面包含的组件和内容有:

spring cloud eureka,服务注册和服务发现

spring cloud config,动态配置项

ribbon,客户端负载均衡

feign,

hystrix,熔断

turbine

Spring Cloud Starters

同一个服务中的多数据库支持(AOP)

全链路traceId追踪

velocity 前端模板

mybatis, pageHelper (分页), druid (连接池)

redis(序列化采用的是jdk默认序列化方案)

slf4j & logback(及其配置)

国际化配置

全局错误信息catch

线程池

服务健康检查, 服务全链路健康检查

代码的业务是:首先有一个登录页面,用户登录以后,能看到一个微博(moment)列表,同时也可以添加微博。在每个微博的最右边,可以看到每个微博的评论列表,也能添加评论。前端代码写的非常粗糙。。。 如果你真的运行了,求不吐槽。

这里不谈根据业务的需求去选择是否微服务化,也不争辩什么时候该用什么样的框架,我这里只是把我们app后端的代码,抽象成一个代码库,希望能为你提供帮助。我们产品上线2个多月,后端基本没有出过问题(也跟量小有关系)。

运行

首先,你在本地需要有一个redis和mysql,redis默认启动就可以。数据库表的创建语句见下:

create database test;

CREATE TABLE `account` (

`user_id` varchar(127) NOT NULL DEFAULT '',

`user_name` varchar(127) NOT NULL DEFAULT '',

`password` varchar(127) NOT NULL DEFAULT '',

`gmt_created` datetime NOT NULL,

`gmt_modified` datetime DEFAULT NULL,

`is_deleted` tinyint(1) NOT NULL DEFAULT '0',

PRIMARY KEY (`user_id`),

KEY `index_user_id` (`user_id`) KEY_BLOCK_SIZE=10

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `moment` (

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

`user_id` varchar(127) COLLATE utf8mb4_unicode_ci NOT NULL,

`content` text COLLATE utf8mb4_unicode_ci,

`gmt_created` datetime NOT NULL,

`gmt_modified` datetime DEFAULT NULL,

`is_deleted` tinyint(1) DEFAULT '0',

PRIMARY KEY (`id`),

KEY `index_user_id` (`user_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

create database test2;

CREATE TABLE `comment` (

`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

`moment_id` bigint(20) unsigned NOT NULL,

`content` text COLLATE utf8mb4_unicode_ci,

`gmt_created` datetime NOT NULL,

`gmt_modified` datetime DEFAULT NULL,

`is_deleted` tinyint(1) DEFAULT '0',

PRIMARY KEY (`id`),

KEY `index_moment_id` (`moment_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

系统环境需要Java 8 和 maven 3及以上

运行命令如下 (需要按顺序运行每个模块):

cd spring-cloud-parent

mvn clean install -DskipTests

cd ../spring-cloud-client

mvn clean install -DskipTests

cd ../spring-cloud-starter

mvn clean install -DskipTests

cd spring-cloud-eureka

mvn clean spring-boot:run

cd spring-cloud-account

mvn clean spring-boot:run

cd spring-cloud-biz

mvn clean spring-boot:run

cd spring-cloud-gateway

mvn clean spring-boot:run

浏览器中打开 http://127.0.0.1:7001/index

代码解释

代码中的依赖关系见下图:

webp

spring-cloud-parent

是一个空的mvn project, 包含了一些被其他项目所需要的公共的依赖。我这里创建parent,仅仅是因为我不想把很多相同的依赖在spring-cloud-eureka、spring-cloud-biz、spring-cloud-account和spring-cloud-gateway这几个项目中重复写一遍,所以,一般微服务project都集成spring-cloud-parent。嗯,懒惰是人类的第一生产力。

spring-cloud-starter

是一个我创建的spring starter, 里面包含的是一些公共的bean,和一些公共的bean配置,比如国际化locle配置、缓存CacheService配置,messageConvertor配置等,spring-cloud-biz、spring-cloud-account和spring-cloud-gateway等微服务都需要依赖和共用这些基础配置。

spring-cloud-client

是一个公共依赖,这里包含的是一个util类,以及多个模块需要共同使用的、和数据库表对应的Java model.

spring-cloud-eureka

是一个服务注册和服务发现中心,需要集群化。代码里,我把spring-cloud-config动态配置项也集成在这里面了。服务发现的心跳检测时间,也从15s改到了5s,这对于快速发现节点故障很有作用。

spring-cloud-account

是整个工程的账号服务模块。对于一个大型的系统来讲,单独的账号服务系统是很有必要解耦出来的。

spring-cloud-biz

是实际的业务模块,包括发微博模块和评论模块。整个代码中动态使用了两个数据库,我这里对数据库的切分只是简单从业务上切分,既:微博在一个库中,评论在另外一个库中,同时写了一个@TargetDataSource注解,方便动态切换数据库。其实对于分库、分表、读写分离,代码都是类似的。

spring-cloud-gateway

是整个系统的网关服务,所有来自端上的请求,包括app或者web页面,都需要先到网关,由网关做过处理之后再转发给其他服务。比如,网关需要处理登录状态问题,需要处理上传文件问题,需要做一些过滤,以及其他多种切面上的事情。

总结

以 上就是我对Java大型互联网-高级架构师教你如何实践微服务架构全方位的技术问题 及其优化总结,分享给大家,希望大家知道什么是Java大型互联网-高级架构师教你如何实践微服务架构全方位的技术问题及其优化。觉得收获的话可以点个关注收藏转发一波喔,谢谢大佬们支持!

1、多写多敲代码,好的代码与扎实的基础知识一定是实践出来的

2、可以去百度搜索腾讯课堂图灵学院的视频来学习一下java架构实战案例,还挺不错的。

最后,每一位读到这里的网友,感谢你们能耐心地看完。希望在成为一名更优秀的Java程序员的道路上,我们可以一起学习、一起进步。