Clay 的技术空间

用进废退 | 艺不压身

微服务与微服务架构

微服务的概述

微服务理论的提出者马丁。福勒(Martin Fowler) 在其博客中详细描述了什么是微服务。微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题 / 提供落地对应服务的一个服务应用;狭意的看,可以看作 Eclipse 里面的一个个微服务工程 / 或者 Module。

微服务架构的概述

微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分为一组小服务,每个服务运行在自己的独立进程中,服务间通信采用轻量级通信机制 (通常是基于 HTTP 的 RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。另外,应该尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储技术。

阅读全文 »

@RequestBody 注解抛出异常

问题描述:使用 @RequestBody 注解时,抛出异常信息 “Required request body is missing”

采用 SSM 框架,前端将参数传递给后端,SpringMVC 可以通过注解 @RequestBody 将传递参数绑定在 Controller 的方法参数中。此时必须注意,当请求方法声明为 GET 和 DELETE 的时候,HTTP 请求规范里规定是不会有 RequestBody 的,只有请求方法声明为 POST 和 PUT 的时候才有,因此 @RequestBody 不适用于 GET 与 DELETE 方法。还有如果请求方法声明为 GET、DELETE,那么 SpringMVC 可以直接将传递参数绑定在方法的参数中,如果请求方法声明为 POST、PUT,则必须使用注解 @RequestBody 修饰 Controller 中的方法参数,否则无法获取前端传递过来的参数值。正确的使用方法如下:

阅读全文 »

Docker-Compose 单机安装 RabbitMQ

RabbitMQ 的数据库名称规则是 NODENAME@hostname,由于 Docker 每次从 Docker Image 启动容器的时候会自动生成 hostname,这样一来之前保存在主机上的数据库就会没用了,包括之前创建的用户也会没有了。所以在创建容器的时候必须指定 --hostname=rabbitmq,这样 Docker 环境启动后 RabbitMQ 就会一直读取固定目录中的数据了。docker-compose.yml 的文件内容如下,其中 RABBITMQ_DEFAULT_USER 为用户名,RABBITMQ_DEFAULT_PASS 为用户密码,5672 为 RabbitMQ 的服务端口,15672 为 RabbitMQ 的 Web 控制台的端口。RabbitMQ 的 Web 控制台默认是未启用的,若需启用 Web 控制台的功能,可以挂载对应的配置文件到容器内的 /etc/rabbitmq/enabled_plugins,而配置文件的内容为 RabbitMQ 启用的插件列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
rabbitmq:
image: rabbitmq:3.8.14
container_name: rabbitmq-3.8.14
hostname: rabbitmq
privileged: false
networks:
rabbitmq-network:
ipv4_address: 172.175.0.5
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin
ports:
- 5672:5672
- 15672:15672
volumes:
- '/container/mahattan/rabbitmq/enabled_plugins:/etc/rabbitmq/enabled_plugins'

networks:
rabbitmq-network:
name: rabbitmq-network
driver: bridge
ipam:
config:
- subnet: 172.175.0.0/24
阅读全文 »

前言

本文适用于 CentOS/Debian/Ubuntu 等 Linux 发行版系统。

JDK 安装

由于 Gradle 的运行依赖于 JDK,但是安装 Oracle JDK 不是必需的,如果不想安装可以使用 Open-JDK 替代,而且大多数 Linux 发行版自带 Open-JDK。

阅读全文 »

RPC 框架的核心

  • RPC 的核心模块: 通讯、序列化
  • 主流的 RPC 框架: Dubbo、gRPC、Thrift、HSF、Motan、ZBUS

RPC 的基本调用原理

rpc-principle-1

阅读全文 »

大纲

MyBatis 实用场景

MyBatis 批量操作

调用不带参数的 openSession() 方法时,创建的 SqlSession 对象具有如下特性:

  • 会开启一个事务(不会自动提交)
  • 数据库连接对象会从由环境配置的数据源实例得到
  • 事务隔离级别将会使用驱动或数据源的默认配置
  • 预处理语句不会被复用,也不会批量处理更新

值得一提的是,openSession() 方法的 ExecutorType 类型的参数是枚举类型,取值如下:

  • SIMPLE:这个执行器类型不做特殊的事情(默认执行器),它会为每个 SQL 语句的执行创建一个新的预处理语句。
  • REUSE:这个执行器类型会复用预处理语句。
  • BATCH:这个执行器会批量执行所有更新语句。
阅读全文 »

SpringBoot-2.1.0+ 整合 Apache Dubbo-2.7.0,启动应用后提示需要添加 SpringBoot 配置 “spring.main.allow-bean-definition-overriding=true”

异常日志:

1
2
3
4
5
6
7
8
9
10
11
***************************
APPLICATION FAILED TO START
***************************

Description:

The bean 'dubboConfigConfiguration.Single', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.

Action:

Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
阅读全文 »

Dubbo 使用 Curator 连接 ZooKeeper 失败

异常日志:

1
Caused by: org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented for /dubbo/xxx.xxx.service.UserService/providers/dubbo ....

异常分析:ZooKeeper 的版本与 Curator 的版本不兼容所导致,Curator 官网说明如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
第一种情况:

Curator 2.x.x
compatible with both ZooKeeper 3.4.x and ZooKeeper 3.5.x

Curator 3.x.x
compatible only with ZooKeeper 3.5.x and includes support for new features such as dynamic reconfiguration, etc.

第二种情况:

ZooKeeper 3.5.x
Curator 4.0 has a hard dependency on ZooKeeper 3.5.x
If you are using ZooKeeper 3.5.x there's nothing additional to do - just use Curator 4.0

ZooKeeper 3.4.x
Curator 4.0 supports ZooKeeper 3.4.x ensembles in a soft-compatibility mode. To use this mode you must exclude ZooKeeper when adding Curator to your dependency management tool.
阅读全文 »

大纲

MyBatis 四大对象

四大对象介绍

MyBatis 的四大对象包括:Executor、StatementHandler、ParameterHandler、ResultSetHandler。四大对象的工作职责如下:

  • Executor(执行器):负责整个 SQL 执行过程的总体控制
  • StatementHandler(语句处理器):负责和 JDBC 层交互,包括预编译 SQL 语句和执行 SQL 语句,以及调用 ParameterHandler 设置参数
  • ParameterHandler(参数处理器):负责设置预编译参数
  • ResultSetHandler(结果集处理器):负责将 JDBC 查询结果映射到 JavaBean 对象
阅读全文 »
0%