搬砖小抄

搬砖小抄

备用网址 [https://festive-leakey-482867.netlify.app/]

以windows服务的方式运行FRP

前几天看见有人在frp提工单问是否可以支持windows服务,正好有解决类似问题的经验,于是给作者提了一个PR,不过作者表示:

  1. 类似脚本打算放到专门的仓库中维护
  2. 那个专门仓库目前无人维护

那就是没法了,只能记在自己的小本子上了。

效果演示

k3s集群网络通讯问题整理

表现

  • 在集群网络中ping另外一个Service,网络不通
  • 对另外一个Service进行dns解析,报错

部署一个netshoot服务,测试结果如下:

1
2
3
4
5
bash-5.0# ping my-service
ping: my-service: Try again
bash-5.0# nslookup my-service
;; reply from unexpected source: 10.42.3.60#53, expected 10.43.0.10#53
;; reply from unexpected source: 10.42.3.60#53, expected 10.43.0.10#53
远程调试容器网络中的JAVA应用

假设因为某种原因,你想对已经部署的java应用进行调试,应该怎么做呢?我假设你的部署环境是这样子的:

  • 你的应用跑在kubernetes
  • 你的开发机不没有加入kubernetes集群,换而言之,你的开发机和应用的网络是不通的。
  • 你的容器启动命令并没有预留JVM远程调试参数(实际上也不可能在正式环境加这个参数)。

也就是说,虽然我们知道可以利用JVM的远程调试功能来解决这个问题,但是具体实施的时候,还需要解决以下问题:

  1. 打通开发机和JAVA应用之间的网络
  2. 不能重新打docker镜像,但是需要给JAVA应用的增加远程调试的启动参数

这里先给出解决办法:对于第一个问题,可以通过kubernetes对外暴露服务端口来实现,第二个问题则通过JAVA_TOOL_OPTIONS这个环境变量来解决。

spring cloud gateway 配置跨域(CORS)解决swagger 认证失败问题

在部署web应用时,常常会遇到跨域的问题,而spring cloud gateway作为一个API网关,本身是支持跨域的。这里暂不讨论应不应该开启跨域,只是总结一下:

  • 如何开启跨域
  • 解决的实际问题

以下这段配置,放到spring cloud gateway里面,即可开启跨域,放行任何跨域请求

1
2
3
4
5
6
7
8
9
10
11
spring:
cloud:
gateway:
globalcors:
corsConfigurations:
'[/**]':
allowCredentials: true
exposedHeaders: "Content-Disposition,Content-Type,Cache-Control"
allowedHeaders: "*"
allowedOrigins: "*"
allowedMethods: "*"

不要完全照抄这段代码,搞到你的生产环境里面去,原因请阅读相关文档,先了解跨域资源共享(CORS) 。

内网k8s集群中使用frp代理公网请求

公司的某个微服务运行在公司内网的容器网络中,该微服务需要接收某个第三方服务的推送消息。显然,那个第三方服务器无法直接推送消息,需要打通网络

  • 在公网部署FRP服务端(FRPS)
  • 在K8S集群中部署FRP客户端(FRPC)

预期效果如下

在docker中运行nacos-server

官方对nacos的介绍是:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台

目前最新版本是1.2

在开发过程中,有时候需要自己搭建一个nacos服务,官方也提供了相应的部署文档,但最简单的还是使用容器技术。

搭建高可用k3s集群

以下是官方对K3S的介绍

轻量级Kubernetes发行版。易于安装,内存减半,所有二进制文件不到40mb。

适用于:

  • 边缘计算-Edge
  • 物联网-IoT
  • CI
  • ARM
  • Situations where a PhD in k8s clusterology is infeasible

效果演示

docker小抄

容器时代,不掌学点基本功怎么行?
但是,咱也不是专业运维,所以光学过不行,会忘。得记一笔。
而且,由于一些不可描述的原因,只要是涉及到互联网肯定会有一些坑。

MySQL 驱动时区和时间处理

本文以MySQL8以及mysql-connector-java-8.0.18为例,但是其他本版或者其他数据应该也差不多。

在进行数据库开发的时候,和时间打交道就会涉及到时区,一个日期时间字段从应用层数据库客户端数据库服务端 传递过程中会跟以下几个时区打交道:

  • JVM 时区(默认取操作系统时区,见后文)
  • 数据库客户端设置的时区参数(serverTimezone),数据库会话的时区
  • 数据库服务端的时区(默认取操作系统时区,见后文)

要想在时区问题少踩坑(比如存在库里面的时间多了几个小时)可以这样做:

  • 数据库服务端的时区参数time_zone设置一个明确的值,比如+8:00。这个不是必须的,但是建议设置。
  • 数据库客户端通过serverTimezone参数设置自己的时区,这一步至关重要,它应该和java.util.TimeZone.getDefaultRef()的输出一致。
Spring Security EnableOAuth2Sso注解实现原理

@EnableOAuth2Sso注解的源码

1
2
3
4
5
6
7
8
9
10
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@EnableOAuth2Client
@EnableConfigurationProperties(OAuth2SsoProperties.class)
@Import({ OAuth2SsoDefaultConfiguration.class, OAuth2SsoCustomConfiguration.class,
ResourceServerTokenServicesConfiguration.class })
public @interface EnableOAuth2Sso {

}

它解决的问题:

  • 拦截未授权请求:如果用户没有登录,引导用户(去认证服务器)做登录认证
  • (去认证服务器)获取用户的身份信息

对于后端渲染页面视图的Web项目,只需要加上这个注解,即可实现OAuth2接入,无需编写登录页面。如果是前后端分离项目,由于后端不能控制页面跳转,需要前端辅助完成授权码获取,并传递给后端完成后续认证流程。

avatar
j3e
技术面前人人平等