Profile 03 00@2x 0f8539d7f013fd11030f4f7a7b97caf8c2dc5732bc61cba71764f3365c568794

顾咏舜(KU, YUNG-SHUN)


「追求优雅的代码、追求挑战的环境,持续不断学习的程序员」


后端JAVA工程师,工作年资两年六个月。

前一份工作于宏碁(ACER)担任软体工程师,现服务于一间软体新创公司。


軟件开发,技术经理

E-mail : [email protected]

Skype : kudavid6

Phone : +886 986084686



Distributed System

Architecture:

使用Spring Cloud框架实现服务注册与发现、接口代理、服务熔断、配置中心,各服务提供者设计成可弹性集群布署、具复原能力的微服务。 

使用quartz框架实现任务持久化、集群任务中心。

各服务节点通信主要建立在HTTP协议之上,遵守restful设计理念。 

主要实现语言java,少部分专案选用Node.js。


Availability:

使用Kubernetes集群向多个node平均布署pods,为每个服务提供者设定一组虚拟网域以实现负载平衡。

服务节点设健康检测接口,由Kubernetes内建livenessProbe监控容器运行状态,并执行重启。 

每个服务提供者建置两个以上pods,以实现滚动布署。


Partition tolerance:

应用隔离,使用Kubernetes将每个应用运行在独立jvm下。

每个服务提供者可弹性布署(关闭或集群布署),不影响消费者。

服务降级,暂时将不可用区域隔离,于重新运行时恢复服务。

DevOps(CI/CD)

Tools:

Maven、Nexus (Maven Private Repository)、

Jenkins、GitHub、DockerHub、Kubernetes


开发环境热布署:

GitHub 使用Webhook订阅GitHub事件,当dev分支有新版本提交后便触发Jenkins的工作任务,于Jenkins本机编译代码并透过Maven指令打包成可执行的war/jar后,透过ssh远端上传档案并执行脚本运行。 追踪每位开发者于伺服器上运行之程式版本,避免任何手动上传。


生产环境弹性布署:

预先在Kubernetes集群上创建Dm、Service,指定埠号、网域等。

建置Jenkins任务至GitHub拉取代码,透过Maven指令打包为可执行的jar,执行DockerFile創建image上传至DockerHub,运行k8s指令更新image完成滾動佈署。

Open Source Used

MVC:
Spring MVC
Express(Node.js)

Micro service:
Spring 5
Spring Boot 2
Spring Cloud Eureka
Spring Cloud Hystrix
Spring Cloud Zuul
Spring Cloud Bus

Orm:
MyBatis、MyBatis Generator、Sequelize(Node.js)

Scheduler:
Quartz-cluster
Scheduled task on boot

Code style:
Alibaba-java-style-guide

Test:
Jmeter 、Junit、PostMan、Mockito

Message broker:
SQS、RabbitMQ

AWS sdk:
Aws-java-sdk-sqs

Elk stack:
Elsticsearch
Logstash
Kibana

Cloud Service

AWS-EC2

AWS-Elastic Container Service

AWS-RDS

AWS-Simple Queue Service

AWS-Elasticsearch Service

AWS-CloudWatch

AWS-ElastiCache

GCP-Kubernetes Engine 

GCP-Compute Engine

GCP-Cloud SQL

Network

Reverse Proxy Server:
使用Nginx根据档案后缀、特定url转发至不同主机。
JS、CSS、HTML等文本由本机处理,
图片或音源等静态资源请求转发至档案伺服器,
带有特定路径之请求转发至webSocket服务器,
动态请求转发至Kubernetes node上的微服務接口代理,內部轉發使用Kubernetes service实现负载平衡。

Firewall:
Kubernetes node仅开启接口代理监听的埠号,其馀皆不对外服务。
微服务内部采用kube-dns沟通,不需另外加密。
Cloud SQL仅对Kubernetes node开启3306 port。

专案经历


维护过的项目,2016 年 4 月 - 2017年2月

台湾司法院审判系统 2.0

司法院线上起诉系统


使用技术:

JDBC、JSP、Oracle、AJAX、JS、JQuery、HTML、CSS


主持的项目,2017 年 2 月 - 2017 年 8 月

聚合支付平台,集成各家第三方支付金流,为商户提供代收/代付服务,并记录商户馀额。


此系统包含三专案:

金流专案、后台专案、商户DEMO专案


使用技术:

JDBC、JSP、Timer、MySQL、AJAX、JS、JQuery、HTML、CSS


与人协作开发项目,2017 年 8 月 - 2018 年 2 月

重构支付平台,将金流专案分模块重构,建立高扩充性系统以应付串接新渠道,并作分布式集群预备。


此次重构将金流专案拆分为九个模块(公司名隱藏為xxx):

xxx-channel-api(串接上游渠道介面)

xxx-bank-api(核心業務介面)

xxx-channel-xxx(串接上游渠道實作,此类专案共有十数个) * n

xxx-bank(核心業務實作,收付订单处理、商户处理等)

xxx-channel-proxy(渠道路由,供核心业务使用上由渠道服务)

xxx-notify(商户通知中心)

xxx-pay-batch(定时任务中心)

xxx-gateway(网关接口,此专案暴露接口提供服务)

xxx-monitor(网关健康检测,基于request、ssh重启服务之简单实现)


使用技术:

Spring、Spring MVC、MyBatis、JPA、MySQL、Express(Node.js)


设计模式: 

Dependency Injection→自动注入介面调用不同实现类(实现代码间松散耦合)、单例多线程管理对象生命周期

AOP动态代理→增强所有对外接口,统一处理验签加解密、并过滤业务参数。

外部应用容错→上游系统瘫痪时,暂时让所有请求快速失败,并于外部服务恢复时批次补处理。

行级锁(悲观锁)→更新馀额或订单状态时皆使用悲观锁(此类接口可能涉及高并发)。

异步写入日志&操作记录→非核心的业务皆以异步线程池处理。

网关健康检测→基于request判定专案是否正常运行,否则自动重启服务。


主持的项目,2018年 3 月 - 至今

博奕游戏包网服务,为平台提供串接游戏、会员系统、代理商后台、微信登入等服务。


此系统包含六个模块:

包网主系统(实现各外部游戏接口、钱包系统、玩家登入、申请表单等)

包网任务中心(完成每日凌晨结帐、定期与外部游戏钱包对帐并追踪馀额)

代理商后台(提供代理商建立多层下限关系、调整各级占成、返水、游戏设定、活动设定、转移点数等功能)

代理商后台任务中心(定期处理外部注单)

代理商后台插件(供前台显示统计资料)

金流插件(独立管理多个金流渠道,用于与外部API解偶)


使用技术: 

Spring、Spring Boot、MyBatis、MySQL、SQS、Redis、WebSocket、Express(Node.js)、Sequelize(Node.js)


设计模式:

(与前专案相同模式不再列出)

多环境布署→一套代码交付给不同客户,利用环境变数启用不同的游戏服务。

队列服务→结帐任务拆分,消息生产者与消息消费者解耦。

跨服务会话共享→使用redis储存登入会员资讯。

缓存策略→将外部游戏统计资料存入redis中提升查询效率。


主持的项目,2018年 6 月 - 至今

游戏开发系统商,提供包网自制开发的H5游戏(目前已上线七款)、系统商后台。

(此系统为微服务架构)


此系统包含专案:

xxx-cloud-register(微服务注册中心)

xxx-cloud-zuul(微服务接口代理)

xxx-cloud-schedule(游戏排程中心)

xxx-cloud-webSocket(通知中心)

xxx-cloud-data-source(游戏数据源接口)

xxx-cloud-launch(游戏启动接口)

xxx-cloud-weixin(微信登入口)

xxx-backstage-system(后台专案)


使用技术: Spring Boot、Spring Cloud、MyBatis、MySQL、SQS、Redis、WebSocket


设计模式:

(与前专案相同模式不再列出)

观察者模式→创建WebSocket Session,为使用者建立观察者物件,并加入一个或多个观察者名单,等待主题更新。

发布/订阅模式→服务节点订阅队列,外部开奖中心生产消息,发布者与订阅者经由消息代理沟通,实现松散耦合。

服务注册与发现→将服务提供者注册至中心供消费者调用。

接口代理→消费者透过接口代理(zuul)調用服務,將會話保存在代理上

缓存策略→游戏开局时将风控设定、各类型注单限额载入内存,玩家下注时加快校验速度。

     利用缓存键值设计幂等接口,避免网路迟缓时重复处理下注。

毕业学校


成功大学(本科) 数学专业

Bachelor of Science in Mathematics, National Cheng Kung University

其它证照


证券业商高级业务员

High Level Sales Representative in Stock Company