Kubernetes is great! It helps many engineering teams to realize the dream of SOA (Service Oriented Architecture). For the longest time, we build our applications around the concept of monolith mindset, which is essentially having a large computational instance running all services provided in an application. Things like account management, billing, report generation are all running from a shared resource. This worked pretty well until SOA came along and promised us a much brighter future. By breaking down applications to smaller components, and having them to talk to each other using REST or gRPC. We hope expect things will only get better from there but only to realize a new set of challenges awaits. How about cross services communication? How about observability between microservices such as logging or tracing? This post demonstrates how to set up OpenTracing inside a Kubernetes cluster that enables end-to-end tracing between serv
| package logging | |
| import ( | |
| "github.com/rs/zerolog" | |
| "github.com/rs/zerolog/log" | |
| "gopkg.in/natefinch/lumberjack.v2" | |
| "os" | |
| "path" | |
| "io" | |
| ) |
| #!groovy | |
| # Best of Jenkinsfile | |
| # `Jenkinsfile` is a groovy script DSL for defining CI/CD workflows for Jenkins | |
| node { | |
| } |
mathclub是最近做的一个个人项目,帮助考SAT的同学通过在线做题、回顾、问答提高成绩。用户功能有:计次/计时做题、成绩单、错题分布、错题回顾、提问、汇总以及注册登录。管理后台主要是题库管理、学员管理、成绩单管理、问题回复。怎么看都像学校里的课设,的确项目本身并不出奇,开发上选用的一些方案或许更有意思。
整个项目一个人从产品需求、原型设计、前后端开发到部署历时2周左右。可以从截图上感受一下:
技术选型上服务端是Node.js,应用框架选了老牌的Express(4.x变化挺大不少中间件都废了),数据服务用的是MongoLab(MongoDB的云服务平台),图片上传用的是又拍云,程序部署在Nodejitsu上。模板引擎没选主流的Jade或ejs,而是用Express React Views它实现了在服务端渲染React组件。前端框架是用React,这次有意想追求前后端全部组件化的组织。之前是用Webpack实现CommonJS模块打包,这次用Browserify配置更简单,它有丰富的transform很赞,其中的reactify转换React的JSX很完美。CSS用Sass+autoprefixer让人省心。将这一切串起来的自动构建工具是Gulp。我其实崇尚用最精简的工具组合开发,上述组合在我看来比较精简了。(帖纸留念)

If you prefer to watch video tutorials with live-coding, then check out this series I recorded with the same contents as in this article: Egghead.io - Introduction to Reactive Programming.
| import sys | |
| import time | |
| import subprocess | |
| import types | |
| from tempfile import TemporaryFile | |
| def remote_sh(target_host, login, password, command_text, stdout=None, stderr=None): | |
| winrs_text = 'winrs -remote:{0} -username:{1} -password:{2} -noprofile {3}'.format( | |
| target_host, login, password, command_text) | |
| #print('winrs text: {0}\n'.format(winrs_text)) |
| #!/usr/bin/env python | |
| """A Tornado example of RPC. | |
| Designed to work with rpc_server.py as found in RabbitMQ Tutorial #6: | |
| http://www.rabbitmq.com/tutorials/tutorial-six-python.html | |
| Some code is borrowed from pika's tornado example. | |
| """ |
| # Note that target_env.login and target_env.password is global variables | |
| # Maybe I should add this into Fabric project (http://docs.fabfile.org/en/1.4.2/index.html). | |
| # This is complicated task for sure but it would be nice if Fabric could use ssh under Linux and PowerShell Remoting under Windows. | |
| def remote_sh(target_host, command_text, ignore_error=False): | |
| print('run PowerShell script block at {0}: {1}'.format(target_host, command_text)) | |
| command_text = command_text.replace('"', '\'') |
| import redis | |
| import threading | |
| class Listener(threading.Thread): | |
| def __init__(self, r, channels): | |
| threading.Thread.__init__(self) | |
| self.redis = r | |
| self.pubsub = self.redis.pubsub() | |
| self.pubsub.subscribe(channels) | |
