spring-cloud服务注册与发现组件——Eureka

Spring Cloud之服务发现——Eureka(发音为[juә’ri:kә])

  • 服务注册与发现以及反馈的实现流程:

    1. Provider将自己的节点信息发送到指定的服务注册机上;
    2. 服务注册机将Provider发送过来的信息保存在指定区域,等待Consumer查询;
    3. Provider通过定期向服务注册机发送消息确保自己不会被注销,而当服务注册机长时间未收到某个Provider发送过来的信息时,会自动将该Provider注销。
    4. 当Provider网络地址发生变更时,会自动重新注册节点信息到服务注册机,避免了人工修改配置的问题。
  • Eureka的实现机制:

    1. Eureka分为Server端和Client端,Server端提供服务发现的能力,当微服务节点启动时,会自动向Server端注册自己的节点信息,而Server端则负责存储这些节点信息,供服务调用者查询;
    2. Client端一般和微服务集成,为微服务提供注册服务到Server端的能力,并从Server端获取最新的已注册服务列表的信息缓存到微服务端;
    3. 微服务启动后,会周期性(默认30s)向Server端发送心跳以防止被注销;
    4. 同时,Server端也会周期性(默认90s)的检查已注册的各个微服务是否仍然存活,如果超时,则注销该微服务的注册信息;

Eureka的基础实现

  • Server端实现

首先创建一个基础的SpringBoot工程,假设是Maven工程,在POM文件中引入如下依赖:

1
2
3
4
5
6
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>

在启动类中加入注解@EnableEurekaService,声明这是一个Server实例。

application.yml中加入如下内容:

1
2
3
4
5
6
7
8
server:
port: 8761
eureka:
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://localhost:8761/eureka/
  • Client端实现

首先创建一个基础的SpringBoot工程,假设是Maven工程,在POM文件中引入如下依赖:

1
2
3
4
5
6
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>

application.yml中加入如下内容:

1
2
3
4
5
6
7
8
9
spring:
application:
name: microsoftservice-provider-user
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true

高可用Eureka实现

单节点的Eureka无法满足线上环境高可用的要求。一旦发生故障,轻则影响服务的可达性,重则引发服务瘫痪,因此,以集群的方式部署Eureka是非常必要的。

Eureka主页访问认证实现

非JVM的微服务注册与发现

Eureka的自我保护模式实现

微服务导论

“微服务”——一个在当前种类繁多的软件架构中出现的新术语。虽然我们对这种事的自然反应一般都是轻蔑的瞥一眼,但真正能吸引我们的其实是术语中描述的一种软件系统风格。我们在过去的几年中看到了有一些项目使用了这种风格,迄今为止,他们的结果大部分都是正面的,因此,我们很多的同事也将它作为了一种构建企业级应用的默认风格。但是,并没有太多的的信息来告诉我们微服务风格究竟是什么,以及怎么去实现它。

简而言之,微服务架构风格是一种由多个微小服务集合组成的单应用开发风格,其中的每一个微小服务都拥有自己的进程以及轻量级的交互机制,通常是一个基于HTTP的API。这些服务围绕业务能力单独构建,并且可以被全自动化部署机制实现各自独立部署。对于这些服务也有一个纯粹的最小集中化管理,通常他们可以用不同的编程语言以及不同的数据存储技术来实现。

为树莓派配置国内软件源

因为众所周知的原因,树莓派的国外软件源在国内访问速度非常考验耐性,所以,为了能让树莓派愉快的更新到最新版本,有必要将默认的软件源替换成国内的同步镜像。下面就以清华大学的镜像站点为例子进行说明

1
2
$ sudo vim /etc/apt/sources.list
# 将默认的软件源注释掉,新增如下的配置
1
2
deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ bullseye main non-free contrib rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ bullseye main non-free contrib rpi

其中bullseye为当前树莓派系统的版本代号,可以参考默认的国外源的镜像配置中的代号,保持一致即可。

1
2
$ sudo vim /etc/apt/sources.list.d/raspi.list
# 将默认的软件源注释掉,并新增如下的配置
1
deb http://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ bullseye main

bullseye和默认配置的保持一直即可。

怎么在linux上清除命令的输出内容

1
$ ls -al > /dev/null 2>&1

执行上面的命令之后你会发现终端没有任何输出,为什么会这样呢?

继续执行下面的命令

1
$ ls -qwer > /dev/null 2>&1

发现还是没有任何输出,即使该命令是错误的。

造成这一切的根源在于命令最后面的2>&1

我们知道/dev/nulllinux系统上的伪设备文件,可以被用来消除来自程序的输出。尤其是对于命令行程序而言有更大的意义。

/dev/null看起来像是一个水漕,比如说一个可写的目标文件,然而只要有任何数据流被写入这个文件,都会被马上删除。

当用户不需要来自程序的输出信息时,这个命令是有用的。因为程序可能会生成大量的输出内容,而这会给分析日志的工作带来混乱。

对于/dev/null 2>&1命令,2在linux上代表STDERR(标准错误输出),而1则代表STDOUT(标准输出)。因此,这个命令的最终解释就是将标准错误输出和标准输出重定向到/dev/null,即消除这两种类型的输出。

我们再来具体分析下这个命令的构成,首先>表示重定向,而被重定向的对象则是/dev/null。而不是打印到终端。

这是否意味着该命令所有的输出都会被重定向到/dev/null呢,并不是,因为它只会重定向标准输出。

因此,还需要加上2>&1。表示将2(标准错误输出)重定向到1(标准输出)。那么&代表什么意思呢?如果不加上&的话,标准错误输出将会输出到名字为1的文件中。而&会告诉系统1不是一个文件,而是一个标准输出描述符号。

最后,我们将标准输出和标准错误输出都重定向到了/dev/null。而/dev/null会将所有的输出内容全部清除掉。

小结:/dev/null是linux系统上一个特殊的设备文件,可以将任何命令的标准输出(不管是标准输出还是错误输出)清除掉。

在manjaro中修复deepin-wine-wechat对话框输入中文乱码的问题

最近在manjaro上安装了deepin-wine-wechat,毕竟生活中用微信还是挺多的,但腾讯貌似短期内并没有将微信移植到linux桌面平台的打算,所以,作为替代方案,只能使用deepin基于wine定制的微信客户端

首先GNU/Linux操作系统作为一款世界流行的操作系统,其稳定性和可定制性都是非常优秀的。但由于众多linux发行版大部分都是从国外发展起来的,虽然近几年来国内也有几家比较优秀的linux厂商,但终究起步别别人晚,所以还是有很多需要提升的地方。对于打着国产操作系统旗号的Deepin团队而言,想要在国内推广他们定制的Deepin Linux发行版,首先在通讯软件方面就要能够提供最常用的几款即时通讯软件的移植版,毕竟国内通讯软件市场还是腾讯一家独大,奈何鹅厂迟迟不将linux平台的QQ、微信的开发提上日程,而目前能够最大限度移植Windows程序到linux上执行的莫过于使用Wine了。所以,基于Wine提供linux版的微信和QQ也成为了最为方便快捷的选择。

这次安装完deepin-wine-wechat之后,正常启动没问题,但当我打开和好友聊天的对话框时发现我输入的中文在内容栏里面都变成了一个个空心的小方块。但当我将消息发送出去之后,我的消息又变成了正常的中文。经过查找资料后发现,是因为wine模拟的windows环境里面缺少了宋体的字体文件,所以,只需要将宋体文件复制到对应的字体目录下就可以了。步骤如下:

1
2
3
1.下载宋体字符集文件:https://www.freefonts.io/downloads/simsun/
2.将解压后的文件复制如下路径:cp ~/Downloads/SIMSUN.ttf ~/.deepinwine/Deepin-WeChat/drive_c/windows/Fonts/
3.重启微信即可解决。

在gnome桌面环境下设置默认文件管理器

gnome桌面设置工具中默认无法设置默认的文件管理器,所以,当我们在kde桌面环境下设置了dolphin为文件管理器之后,重新切回到gnome之后会发现dolphin仍然是默认的文件管理器,所以,我们需要将gnome桌面默认的Nautilus文件管理器重新设为默认值,以下命令可以帮助我们做到这一点:

1
xdg-mime default org.gnome.Nautilus.desktop inode/directory

上述命令会修改~/.config/mimeapps.list的内容,具体内容如下:

1
inode/directory=org.gnome.Nautilus.desktop

分别对应[Default Applications][Added Associations]目录。

国庆假期之后返回上海后的感想

工作篇

兜兜转转,一咋眼的功夫,来上海工作已经两年有余了,刚来上海找工作的那段时间其实心里是没底的,毕竟在上一家公司虽然说也有了两年的工作经验,可是真正学到的东西却没有多少,

面试指南

1、说下你的优点和缺点

  • 缺点:

    公开演讲

在linux系统终端查看硬件信息

使用如下命令查看包括CPU、内存、硬盘、主板在内的各种硬件相关的信息

  • CPU型号

    1
    cat /proc/cpuinfo | grep "model name" | uniq
  • 查看CPU物理个数

    1
    cat /proc/cpuinfo | grep "physical id" | uniq | wc -l
  • 查看内存信息

    1
    2
    3
    # 先安装工具软件,以archlinux为例
    sudo pacman -S dmidecode
    sudo dmidecode -t memory | grep Size
  • 查看内存条厂家

    1
    sudo dmidecode -t memory | grep Manufacturer
  • 查看硬盘信息

    1
    fdisk -l | grep "Disk /dev/sd"
  • 查看主板信息

    1
    sudo dmidecode | grep -A16 "System Information$"

使用netcat工具在两台linux主机之间通信

为什么我们不使用当下流行的即时通讯工具在PC间通信或者传输文件

目前国内使用率最高的两款即时通讯工具莫过于鹅厂的两款工具——微信和QQ。因为某些众所周知的原因,这两款工具在linux平台要么直接没有,要么只有一个复古的阉割版,功能少的让人怀疑是不是鹅厂直接把10年前的产品直接拿来用了。基于这些现实的问题,对于linux用户来说,其实可替换方案也不是没有,最好的办法就是使用telegram,但在中国,这种方案并不是人人都能够直接拿来用,最直接的原因就是使用这款软件必须要学会科学上网(比如访问谷歌或者油管)。而科学上网在中国处于法律的灰色地带,一般人没有途径也不愿意承担这样的风险。那么作为一名linux用户,只要具备基本的使用命令行的能力,其实方法还是有很多的。这里介绍一种非常方便而且直观的通讯工具——netcat,供大家参考。

netcat是个什么样的工具

netcat是一款网络工具,可以在基于TCP和UDP网络连接的基础上执行读写操作。

它被设计为一个可靠的后端工具,可以直接在其他程序或者脚本中被使用。同时,它还是一个用来调试和探测网络的工具。因为它可以创建几乎所有你可能需要的连接类型。

netcat有哪些特性

  • 流出和流入连接:例如来自基于TCP或者UDP的任意端口的连接。
  • 隧道模式:它允许创建特殊的隧道,如 UDP 到 TCP,并且可以指定所有网络参数(源主机端口/接受主机端口、监听端口/接口和允许连接到隧道的远程主机)。
  • 使用随机发生器进行端口扫描
  • 高级使用选项:例如传输和接收数据的缓冲发送模式(每 N 秒一行)和 hexdump(到 stderr 或到指定文件)。
  • 可选的 RFC854 telnet 代码解析器和响应器。

如何将netcat作为一款即时通讯工具呢

  1. 首先,我们需要在需要建立通讯的主机上安装netcat工具,使用linux自带的包管理器安装即可。

  2. 然后选择一台已经安装好netcat的机器,在终端中执行如下命令:

    1
    nc -l -vv -p 12345

    其中-lp表示在本机的12345端口进行监听,并创建一个TCP连接。-vv表示尽可能的展示运行过程中的系统消息,-p表示要监听的端口号。

  3. 选择要与监听主机建立连接的机器,在终端中执行如下命令:

    1
    nc 步骤2中创建监听的主机ip 步骤2中创建的监听端口
  4. 执行完2、3之后,一条连接已经创建完成,可以开始互发消息了。

需要注意的是,连接双方发送的消息会全部展示在各自的屏幕上,如果有多于两个以上的连接方则无法区分消息的来源。

使用netcat传输文件

netcat还可以用来传输文件

  1. 对接收方执行如下命立:

    1
    nc -l -vv -p 12345 > received_file
  2. 在发送方执行如下命令

    1
    nc 接收方的ip地址 12345 < received_file

需要注意的是,这里创建监听的动作是由接收方发起的,而发送方需要和接收方建立连接并发送文件。