簡單地說, 微服務是系統架構上的一種設計風格, 它的主旨是將一個本來獨立的系統拆分紅多個小型服務,這些小型服務都在各自獨立的進程中運行,服務之間基於 RPC 進行通訊協做。 被拆分紅的每個小型服務都圍繞着系統中的某一項或一些耦合度較高的業務功能進行構建, 而且每一個服務都維護着自身的數據存儲(劃重點,每一個微服務都有本身的數據庫實例)、 業務開發、自動化測試案例以及獨立部署機制。java
tips:分佈式事務自己的實現難度就很是大,因此在微服務架構中,咱們更強調在各服務之間進行 「 無事務 」 的調用,而對於數據一致性,只要求數據在最後的處理狀態是一致的便可;若在過程當中發現錯誤,經過補償機制來進行處理,使得錯誤數據可以達到最終的一致性。git
Spring Cloud 是一個基於Spring Boot實現的微服務架構開發工具。它爲微服務架構中涉及的配置管理、服務治理、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分佈式會話和集羣狀態管理等操做提供了一種簡單的開發方式。github
Spring Cloud 的出現,能夠說是對微服務架構的巨大支持和強有力的技術後盾。它是一個解決微服務架構實施的綜合性解決框架,它整合了諸多被普遍實踐和證實過的框架做爲實施的基礎部件,又在該體系基礎上建立了一些很是優秀的邊緣組件。舉個 Dubbo 和 Spring Cloud 差別性的例子:在使用 Dubbo 開發過程當中,分佈式配置中心(百度的 Disconf、Netflix的Archaius、360的QConf、淘寶的 Diamond 等)、連接跟蹤(京東的 Hydra、Twitter的 Zipkin 等)...一系列須要的組件,我都要去找第三方進行集成,還要考慮版本兼容的問題。而 Spring Cloud 就是一個微服務解決方案的「全家桶」,幾乎我須要的所有微服務組件,我都能在其中找到「原裝組件」:分佈式配置中心(Config)、連接跟蹤(Sleuth)、批量任務(Task),並且能夠完美兼容。spring
服務治理體系能夠說是微服務架構中最爲核心和基礎的模塊, 它主要用來實現各個微服務實例的自動化註冊與發現。服務治理體系中的三個核心角色: 服務註冊中心、 服務提供者以及服務消費者。而 Eureka Server 就承擔了 Spring Cloud 的服務註冊中心。接下來捋一捋 Eureka Server 進行服務治理的過程:數據庫
SpringBoot 版本號:2.1.6.RELEASE
SpringCloud 版本號:Greenwich.RELEASE緩存
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> <version>2.1.0.RELEASE</version> </dependency>
server: port: 1111 eureka: instance: hostname: localhost prefer-ip-address: true client: # 表示不向註冊中心註冊本身 register-with-eureka: false # 註冊中心的職責是維護實例,不須要去檢索服務 fetch-registry: false service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ server: # 是否要打開自我保護機制 enable-self-preservation: true
eureka 的配置項主要有三項:instance、client、server。「instance」維護該服務的實例信息,包括 hostname、port 這類描述實例特徵的元數據信息;「client」主要是服務註冊數據的配置,好比超時時間、服務緩存時間等;「server」是服務註冊中心特有的配置,配置 Eureka Server 的相關配置項,好比上面的是否打開自我保護。網絡
//啓動一個服務註冊中心 @EnableEurekaServer @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
至此,咱們一個Eureka Server — 服務註冊中心就搭建好了。架構
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
server: port: 2222 spring: application: name: cloud-eureka-client eureka: # 服務註冊相關的配置信息 client: service-url: defaultZone: http://localhost:1111/eureka/ instance: # 是否優先使用IP地址做爲主機名的標識 prefer-ip-address: true
就這樣,咱們的一個 Eureka Client 算是註冊到 Eureka Server 上了。接下來,讓咱們試試用 DiscoveryClient 發現咱們的服務信息:app
// 自動化配置, 建立 DiscoveryClient 接口針對 Eureka 客戶端的 EurekaDiscoveryClient 實例 @EnableDiscoveryClient @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application .class, args); } }
@RestController public class HelloController { private final Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private DiscoveryClient discoveryClient; @Value("${spring.application.name}") private String serviceId; @RequestMapping(value = "/hello", method = RequestMethod.GET) public String index() { List<ServiceInstance> instances = discoveryClient.getInstances(serviceId); ServiceInstance instance = instances.get(0); logger.info("/hello, host:" + instance.getHost() + ", serviceId:" + instance.getServiceId()); return "Hello World"; } }
有了服務註冊中心和服務提供者,咱們試試用 RestTemplate 調用一次服務吧!負載均衡
@RestController public class ConsumerController { @Autowired private RestTemplate restTemplate; @RequestMapping("/ribbon-consumer") public String helloConsumer() { // 這裏訪問的是服務名,而不是一個具體的地址(爲了實現負載均衡策略),在服務治理框架中,這是一個很是重要的特性。 ResponseEntity<String> result = restTemplate.getForEntity("http://cloud-eureka-client/hello", String.class); return result.getBody(); } }