三不朽

API 网关 APISIX配置限流

Publish: September 6, 2021 Category: 运维 No Comments

APISIX支持路由和服务两种模式下限流,都是基于插件方式实现。本文以路由方式实现限流。

首先添加路由一直到第三部如下所示到插件配置:

启用限流插件

截图.png

limit-req插件配置

截图 (3).png

具体配置

截图 (4).png

参数解释:
rate: 指定的请求速率(以秒为单位),请求速率超过 rate 但没有超过 (rate + brust)的请求会被加上延时。

burst: 请求速率超过(rate + brust)的请求会被直接拒绝。

key: 用来做请求计数的依据,当前接受的 key 有:"remote_addr"(客户端IP地址), "server_addr"(服务端 IP 地址), 请求头中的"X-Forwarded-For" 或 "X-Real-IP","consumer_name"(consumer 的 username).

rejected_code: 当请求超过阈值被拒绝时,返回的 HTTP 状态码。此处建议填写 429 标准的http限流code提示。

完成配置

限制请求速度的插件,使用的是漏桶算法。

Serverless架构下使用Spring native GraalVM工具方式加快Spring Boot应用启动速度

Publish: August 4, 2021 Category: 编程 No Comments

关于什么是Spring Navtive 和 Spring Native的优缺点上一篇文章已经有介绍,不太了解的小伙伴可以参考之。

0x01 系统要求

我们以Windows平台为例

下载GraalVM 地址: https://www.graalvm.org/downloads/
设置JAVA_HOME 和 PATH 环境变量
以管理员方式执行 gu install native-image 将native-image 扩展集成到JDK中

这个过程可能失败,需要挂一下代理

set https_proxy=socks5://192.168.xx.xx:1080 

如果执行成功会显示如下信息

C:\Windows\system32>gu install native-image  
Downloading: Component catalog from www.graalvm.org
Processing Component: Native Image                                                                                      
Downloading: Component native-image: Native Image  from github.com                                                      
Installing new component: Native Image (org.graalvm.native-image, version 21.2.0)


阅读剩余部分...

Serverless架构下使用Spring native 容器方式加快Spring Boot应用启动速度

Publish: August 3, 2021 Category: 编程 No Comments

0x01 Spring Native介绍

众所周知Sping Boot的启动速度在15s左右,Serverlless架构下如果没有预留实例的情况下,遇到业务峰时候会出现一部分终端用户服务长时间得不到响应甚至出现不可用情况。对用户体验敏感的应用及其不适合。如果大量预留实例会极大增加服务器成本造成浪费,如果采用人工值守的方式又是一种及其落后的运维方式,复杂业务场景下对运维人员也是一种折磨。那有没有一种方式能加快Spring Boot
的启用速度呢?答案是:有!

这个神器就是Spring官方提供的工具:Spring Native。 Spring Native使用GraalVM提供的编译器将Spring应用直接编译成“Native Image"形式能单独运行并且包含共享库的二进制程序。直接抛弃了JVM,和JVM相比Native Image 简单易用并且足以支撑各种业务场景,包括:微服务、函数计算、更友好的容器支持和k8s。使用Native Image一个最明显的优势是加快启动速度、瞬间触达性能峰值和降低内存占用。

但是Native Image也有一些问题和缺点需要时间来解决,相比传统应用编译Native Image 是一个很重的过程,并且缺少运行时优化,相比JVM还不够成熟。

和JVM相比其主要特点如下:

  • 构建时从入口开始静态分析
  • 未使用部分不会构建
  • 反射、资源和动态代理需要自行配置
  • 类路径在构建阶段固定
  • 没有懒加载:启动时在执行阶段需要的东西都被提前加载到内存
  • 部分代码在构建时运行
  • 并非支持所有Java项目,有一些限制

Spring Native的目的是提供一个除JVM的的另外一个选择,Spring Native 部署提供一个轻量级的容器。事实上在这个平台上Spring 应用几乎不用做修改就可以很好的运行。

Spring Native包含的模块:

  • Spring-native 运行时核心依赖,也提供了Native API接口
  • spring-native-configuration: 配置
  • spring-native-docs: 文档
  • spring-native-tools: 构建工具
  • spring-aot: AOT转换工具核心
  • spring-aot-gradle-plugin: gradle AOT转换插件
  • spring-aot-maven-plugin: maven AOT转换插件
  • samples: 特性样例

阅读剩余部分...

使用Google Firebase中的FCM在Android或IOS中推送消息服务端实现,以PHP为例

Publish: July 30, 2021 Category: 代码分享 No Comments

本文主要讲述使用firebase cloud-message功能在服务端的集成和开发指导。以使用firebase-php的sdk为例子描述该过程。

0x01 SDK集成
firebase没有提供官方的php版本的SDK,貌似google对php不太友好啊! 去github寻找相关sdk,发现这个sdk(GitHub - kreait/firebase-php: Unofficial Firebase Admin SDK for PHP)更新频次和star数量都不错。

项目根目录中使用如下命令安装

composer require kreait/firebase-php

0x02 使用SDK
登录 firebase 控制台 https://console.firebase.google.com/ 找到 项目凭证(credentials)文件。

选中 项目进入项目控制台,在左侧顶部Project Overview一级菜单中,点击右侧齿轮进入 Project Setting。在Service Accounts标签中点击“Generate new private key” 生成凭证文件。



阅读剩余部分...

Spring Boot 中使用Mysql中的Point地址位置geometry类型

Publish: July 17, 2021 Category: 编程 No Comments

如果遇到了如下错误,并且是应为GEO相关的错误,可以参考下面的配置方式

使用JPA 映射Point类型

  1. Maven的pom.xml中添加如下依赖

    <dependency>
        <groupId>com.vividsolutions</groupId>
        <artifactId>jts</artifactId>
        <version>1.13</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-spatial</artifactId>
        <version>5.2.5.Final</version>
    </dependency>
    
  1. 在entity中定义相关字段

    @Column(name = "locationpoint", columnDefinition = "POINT")
    private Point locationpoint;

  1. 在application.properties配置文件中定义“方言”

    # needed for Location domain class
    spring.jpa.properties.hibernate.dialect=org.hibernate.spatial.dialect.mysql.MySQL56InnoDBSpatialDialect
    

这个地方很重要,有一些dialect是没有实现的,因此只能这么用

  1. 使用

    locationRepository.findOne((long) 1).getLocationpoint().getX();
    locationRepository.findOne((long) 1).getLocationpoint().getY();