Mastering Microservices with Java-Packt Publishing(2016)-ReadingNotes.md
A Solution Approach
- ignite v. 點燃 ~ your mind as a solution architect
- monolithic n. 單一的,整個的 (vs isomorphic)
開發環境配置
- NetBeans IDE(如果用NodeJS的話根本不必用什麼IDE,Sublime或者VSCode足夠了)
- Spring Boot
- “It is better to make Jar, not War.” //我估計這都是跟Go語言學的?
- Maven pom.xml(這個就像是NodeJS裏面的package.json)
- Jetty允許從jar中讀取key或trusted stores內容(Tomcat不行嗎?)
- resource model類 in POJO(Java這種靜態編譯類型語言就這麼個不好的地方!)
- 針對controller類的annotation://太繁瑣了
- @RestController = @Controller + @ResponseBody
- @RequestMapping //定義url路由?
- @RequestParam 把url查詢參數映射到controller的方法參數
- @PathVariable 動態映射?基於正則表達式?
- app類的標註:
- @SpringBootApplication,其他:
- @Configuration
- @EnableAutoConfiguration
- @EnableWebMvc:激活DispatcherServlet
- @ComponentScan
- @SpringBootApplication,其他:
- 標註(但仍然是侵入式的):沒有xml配置,甚至不需要web.xml!
- 運行app:
- pom.xml目標:spring-boot:run
- mvn clean生成jar
DDD
- Artifacts of domain-driven design
- 實體(具有ID的)—— 意味着在ORM裏與數據庫持久層是bind的?有必要嗎
- 值對象(VO):immutable
- 服務:提供行爲,沒有內部狀態(意味着只是個接口類?)
- Aggregates(聚合)
- aggregate root(controller類?)
- Relationships, constraints, and invariants bring a complexity that requires an efficient handling in code.
- Repository:與基礎架構層(文件系統/數據庫)交互
- Factory:創建複雜對象
- Modules
- Strategic design and principles(管理大型企業models)
- Bounded context(注意:系統的不同角色用戶看到的是不同上下文視圖)
- Continuous integration
- Context map(同樣的名稱可能出現在不同的context裏,但它們本質上是不同的models,概念細分)
- Shared kernel(共享)
- Customer-supplier(輸入輸出依賴)
- Conformist(團隊之間有上下游關係?什麼鬼)
- Anticorruption layer(隔離外部/遺留系統)
- Separate ways(大集成?)
- Open host service(當外部系統被多個submodels使用時,創建一個單獨的轉換層)
- Distillation(過濾出無用信息,只保留必需的code domain concept)
- DDD:既不是自頂向下地先做UI,也不是自底向上地先做DB設計(!)—— 我覺得這其實是在做細化的需求分析而已
- 一開始的DDD是基於interface,而不是*Impl的嗎?
- 實現
- 使用in-memory倉庫來做mock測試?
實現一個微服務(OTRS?這麼喜歡用縮略語?zb)
- controller類:構建服務endpoints
- API版本化(*)
- 服務類
@Service("restaurantService") public class RestaurantServiceImpl extends BaseService<Restaurant, String> implements RestaurantService { ...
- Repository類實現:使用JPA
- 服務註冊與發現(SOA術語)
- Spring Cloud provides state-of-the-art support to Netflix Eureka, a service registry and discovery tool.
- 測試
- RestaurantControllerTests
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = RestaurantApp.class) public class RestaurantControllerIntegrationTests extends AbstractRestaurantControllerTests { ... }
部署與測試
“Spring took the opportunity to integrate many Netflix OSS projects, such as Zuul, Ribbon(客戶端LB), Hystrix, Eureka Server(服務註冊), and Turbine, into Spring Cloud.”
Ribbon用於微服務之間通信:
1. restTemplate,或:
2. @FeignClient ?
服務器端LB:“Zuul is a JVM-based router and server-side load balancer.”
* 在pom.xml中定義好依賴,然後app類上使用`@EnableZuulProxy`
* zuul:application.yml ?
Hystrix as a circuit breaker
Monitoring:Turbine,通過RabbitMQ連接到Hystrix
部署到容器:
* 4G內存:docker-machine create -d virtualbox --virtualbox-memory 4096 default
* Building Docker images with Maven(略)
安全:OAuth 2.0
- 啓用TLS(HTTPS)
- OAuth 1.0 relies on security certificates and channel binding.
- 而 2.0 “works completely on Transport Security Layer (TSL).”
- OAuth 2.0 4種角色:
- Resource owner(用戶自己)
- Resource server(第3方)
- Client(當前需要授權的頁面)
- Authorization server(提供access tokens和refresh tokens)
- grant types:略
- OAuth implementation using Spring Security
消費微服務:WebApp
- AngularJS(哈哈,哈)
- 爲什麼這本書裏還是用的Gulp?
最佳實踐與公共原則
- Reliability monitoring service – Simian Army(各種Monkeys)
- “Janitor Monkey: Janitor Monkey is a service which runs in the AWS cloud looking for unused resources to clean up.”(這裏似乎不如部署Kubernetes算了)
- Scheduler for Apache Mesos – Fenzo
故障排除指南
- ELK
- Use of correlation ID for service calls