通过WordCount学习MapReduce
文章已收录到我的Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
MapReduce介绍MapReduce主要分为两个部分,分别是map和reduce,采用的是“分而治之”的思想,Mapper负责“分”,把一个庞大的任务分成若干个小任务来进行处理,而Reduce则是负责对map阶段的结果进行汇总。
比如我们要统计一个很大的文本,里面每个单词出现的频率,也就是WordCount。怎么工作呢?请看下图:
在map阶段把input输入的文本拆成一个一个的单词,key是单词,value则是出现的次数。接着到Reduce阶段汇总,相同的key则次数加1。最后得到结果,输出到文件保存。
WordCount例子下面进入实战,怎么实现WordCount的功能呢?
创建项目首先我们得创建一个maven项目,依赖如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apac
学习大数据从安装hadoop开始
文章已收录到我的Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
前言最近上手学习大数据,大数据当然离不开核心的Hadoop,所以首先要搭建一个Hadoop环境。我本机电脑配置不太高,又是学习阶段,所以就整个单机版的玩玩,下面记录一下步骤,希望对大家有所帮助。
前期准备
名称
版本
来源
虚拟机CentOS
CentOS 7
略
JDK
1.8
Oracle官网
hadoop
3.2.2
hadoop官网
虚拟机安装,和JDK安装就不多说了,对于做Java开发的来说都是小菜一碟。
关闭防火墙要关闭防火墙首先得看开没开,查看防火墙状态,使用命令systemctl status firewalld.service。
得先用su root,切换到root,然后使用关闭防火墙命令systemctl status firewalld.service。关了之后在查看状态,如图所示已经关闭了。
但是如果重新开机还是会自动启动,所以要设置开机禁止防火墙。使用命令systemctl disable fi
不懂就学,什么是JWT?
文章已收录到我的Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
起源需要了解一门技术,首先从为什么产生开始说起是最好的。JWT主要用于用户登录鉴权,所以我们从最传统的session认证开始说起。
session认证众所周知,http协议本身是无状态的协议,那就意味着当有用户向系统使用账户名称和密码进行用户认证之后,下一次请求还要再一次用户认证才行。因为我们不能通过http协议知道是哪个用户发出的请求,所以如果要知道是哪个用户发出的请求,那就需要在服务器保存一份用户信息(保存至session),然后在认证成功后返回cookie值传递给浏览器,那么用户在下一次请求时就可以带上cookie值,服务器就可以识别是哪个用户发送的请求,是否已认证,是否登录过期等等。这就是传统的session认证方式。
session认证的缺点其实很明显,由于session是保存在服务器里,所以如果分布式部署应用的话,会出现session不能共享的问题,很难扩展。于是乎为了解决session共享的问题,又引入了redis,接着往下看。
t
2021-12-23
JWT
这波啊~这波是多环境配置
文章已收录到我的Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
前言一般来说,在日常开发中都会分多个环境,比如git代码分支会分为dev(开发)、release(测试)、pord(生产)等多个环境。可以说每个环境对应的配置信息(比如数据库、缓存、消息队列MQ等)都不相同。因此不同的环境肯定需要对应不同的配置文件。接下来学习一下怎么配置多环境的配置文件。
SpringBoot多环境配置因为SpringBoot做多环境配置比较简单,而且现在大部分项目基本都会使用SpringBoot,所以这里就介绍怎么用SpringBoot做多环境配置。
单文件版本单文件在实际中使用得并不多,不过也可以实现多环境配置,这里简单介绍一下。以application.yml配置文件举例,你要在一个配置文件里面配置多个环境的配置,肯定需要分割线将其隔开,所以SpringBoot就规定了使用---进行隔开每个环境。
spring:
application:
name: mydemo
profiles:
active:
2021-12-23
Java
Gateway服务网关之过滤器
文章已收录到我的Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
写在前面前一篇文章写了Gateway的Predicate(用于路由转发),那么这篇文章就介绍另一个主要的核心,那就是Filter(过滤器)。
过滤器有什么作用呢?工作流程是怎么样的呢?请看下图:
从图中很明显可以看出,在请求后端服务前后都需要经过Filter,于是乎Filter的作用就明确了,在PreFilter(请求前处理)可以做参数校验、流量监控、日志记录、修改请求内容等等,在PostFilter(请求后处理)可以做响应内容修改。
过滤器Filter分为局部和全局两种:
局部Filter(GatewayFilter的子类)是作用于单个路由。如果需要使用全局路由,需要配置Default Filters。
全局Filter(GlobalFilter的子类),不需要配置路由,系统初始化作用到所有路由上。
局部过滤器SpringCloud Gateway内置了很多路由过滤器,他们都是由GatewayFilter的工厂类产生。
AddReques
网关很重要,学一学Gateway
文章已收录到我的Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
介绍服务网关要认识一样东西,最好的方法是从为什么需要他开始说起。
按照现在主流使用微服务架构的特点,假设现在有A、B、C三个服务,假如这三个服务都需要做一些请求过滤和权限校验,请问怎么实现?
每个服务自己实现一遍。
写在一个公共的服务,然后让A、B、C服务引入公共服务的Maven依赖。
使用服务网关,所有客户端请求服务网关进行请求过滤和权限校验,然后再路由转发到A、B、C服务。
第一种方式显然是逆天的,这里不做讨论。第二种方法稍微聪明点,但是如果公共服务的逻辑发生改变,那么所有依赖公共服务的服务都需要重新打包部署才能生效。
所以显而易见,使用服务网关则解决了以上的问题,其他服务不需要加入什么依赖,只需要在网关配置一些参数,然后就能路由转发到对应的后端服务,如果需要请求过滤和权限检验的话,都可以在网关层实现,如果需要更新权限校验的逻辑,只需要网关层修改就可以,其他后端服务不需要修改。
接下来再介绍一下服务网关的功能,主要有:
路由转发
API
mybatis-plus多数据源解析
文章已收录到我的Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
写在前面上一篇文章大致介绍了dynamic-datasource的功能,用起来的确很方便,只需要一个@DS注解,加上一些简单的配置即可完成多数据源的切换。究竟是怎么做到的呢,底层是怎么实现呢?带着这个疑问,一起研究了一下源码。
由于框架本身功能点比较多,有很多小功能比如支持spel、正则表达式匹配,动态增删数据源这种功能的源码就不去细讲了。我们只关心核心的功能,就是多数据源的切换。
源码解析首先我们都记得,一开始需要引入spring-boot-starter:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.3.0</version>
</dep
2021-11-02
源码解析
Mybatis-plus
Mybatis-Plus整合多数据源,怎么玩?
文章已收录到我的Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
提出问题在平时开发中,经常会遇到在一个项目里需要使用多个数据源的情况,比如有一部分数据在数据源A,另一部分数据在数据源B,业务需要把这两部分的数据做合并然后从接口返回。
又或者操作完数据源A后,需要切换数据源,操作数据源B。这样的需求,怎么实现?
解决问题其实在mybatis-plus就有相关的实现,是一个基于SpringBoot快速集成多数据源的启动器。
首先要搭建一个springBoot+Mybatis+Mybatis-Plus的项目,搭建项目就不演示了,比较简单。这里讲怎么使用多数据源,首先引入dynamic-datasource-spring-boot-starter。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifact
2021-10-24
Mybatis-Plus
Java基础不简单,泛型很重要!
文章已收录到我的Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
前言其实在开发中经常会看到泛型的使用,但是很多人对其也是一知半解,大概知道这是一个类似标签的东西。比如最常见的给集合定义泛型。
List<String> list = new ArrayList<>();
Map<String,Object> map = new HashMap<>();
那么什么是泛型,为什么使用泛型,怎么使用泛型,接着往下看。
什么是泛型
Java泛型是J2SE1.5中引入的一个新特性,其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter),这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。– 百度百科
这句话读起来有点拗口,但是我们要抓住他说的关键,参数化类型和可以用在类、接口和方法的创建中,我们知道泛型是在什么地方使用。
为什么使用泛型一般我在思考这种问题时,会反过来思考,假如没有泛型会怎么样?
我们以最简
2021-10-24
Java基础
重温并发知识从ThreadLocal开始
文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary
什么是ThreadLocalThreadLocal提供线程的局部变量,这种变量与普通变量的区别在于,每个访问这种变量的线程都有自己的、独立的变量副本。用于解决多线程间的数据隔离问题。
使用场景其实ThreadLocal在很多开源框架中都有应用:
Spring中的事务管理器,比如TransactionSynchronizationManager等。
Mybatis中的ErrorContext类,使用ThreadLocal实现线程安全的单例。
存储session中的一些参数,比如用户信息等。
APIThreadLocal提供了4个常用方法:
set()方法,设置当前线程中变量的副本。
get()方法,获取 ThreadLocal在当前线程中保存的变量副本。
remove()方法,清空当前线程中变量的副本。
initialValue()是一个 protected方法,一般是用来重写的,如果在没有set的时候就调用 get,会调用 initialV
2021-09-25
并发编程