思考:什麼是分佈式?什麼是微服務?html
一些概念:RPC-遠程過程調用,某臺機器想要調用另外一臺機器所須要的一種服務,及分佈式的服務框架,好比dubbo或者SpringCloud。web
鋪天蓋地的分佈式互聯網系統,使用較多的是zookeeper+dubbo組合,而Springboot推薦使用全棧Spring,就是Springboot+SpringCloud。spring
舉例說明一下基本原理:A想要得到數據B,可是有10臺機器均可能存放了數據B,那麼我要去哪臺取數據B呢?A和B中間就有了一個管理站,這個管理站相似一個分配和註冊中心,他能夠告訴A想要的數據B在哪些機器裏,A知道了之後就能夠去這些機器裏取了。一樣B想要把本身數據分享給A,那麼能夠諮詢這個管理站來知道能夠分享給誰。瀏覽器
那麼咱們說的Dubbo或者SpringCloud就是上邊說到的RPC服務框架,而Zookeeper和SpringBoot就能夠做爲這個管理站點來使用。session
官方看文檔,或者網搜相關部署,好比:https://www.cnblogs.com/jaycekon/p/SpringBootDubbo.htmlapp
這篇文章主要以這個爲主來說,上邊的本身看吧,有須要我再單獨補文章~負載均衡
Cloud與Dubbo的區別,Dubbo解決的就是遠程過程調用的RPC服務,而Cloud更全面,它有一整套的分佈式須要的對應的解決方案:配置管理、服務發現、熔斷、路由、微代理、控制總線、一次性token、全局鎖、leader選舉、分佈式session、集羣狀態。因此使用Cloud能夠更快速的與雲平臺進行對接。框架
SpringCloud五大經常使用組件:分佈式
那麼咱們來看SpringCloud怎麼搞~ide
1)、配置-Eureka信息
首先咱們建立幾個須要用到的module,一個註冊中心,一個服務提供方,一個服務使用方。而後在註冊中心進行一下配置:
這裏可使用編譯器中建立Spring Initializr的快捷模式
# 這裏我使用了application.yml的配置,看起來會更清晰
server:
port: 8761 #啓動端口
eureka:
instance:
hostname: eureka-server #eureka實例主機名-註冊中心的名字
client:
register-with-eureka: false #不把本身註冊到註冊中心,由於自己就是做爲註冊中心的存在
fetch-registry: false #不從eureka上獲取註冊信息,同上
service-url:
defaultZone: http://localhost:8761/eureka #配置默認的啓動路徑
/** * 註冊中心
* EnableEurekaServer啓動eureka服務 */ @EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
2)、啓動主程序,打開瀏覽器測試一下(先看啓動信息,已經啓動了該服務):
2)、配置-provider信息
1.建立服務並將主程序啓動(這是服務中心的服務不要停,也是在啓動狀態的),而後再來看服務已經註冊進去了
import org.springframework.stereotype.Service; @Service public class TicketService { public String getTicket() { return "《大鯊魚》"; } }
import com.ice.provider.service.TicketService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TicketController { @Autowired TicketService ticketService; @GetMapping("/ticket") public String getTicket() { return ticketService.getTicket(); } }
server:
port: 8001 #提供方的啓動端口
spring:
application:
name: provider
eureka:
instance:
prefer-ip-address: true #註冊服務的時候使用服務ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka
2.來看,若是有多個應用呢?
修改一下server.port,一個8001,一個8002,分別打包啓動。而後再來看註冊中內心邊(兩個都在)
3)、配置-consumer信息
一樣,先把本身註冊到註冊中心,而後建立個controller,並啓動主程序,檢查:
server:
port: 8200 #提供方的啓動端口
spring:
application:
name: consumer
eureka:
instance:
prefer-ip-address: true #註冊服務的時候使用服務ip地址
client:
service-url:
defaultZone: http://localhost:8761/eureka
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @EnableDiscoveryClient // 開啓發現服務 @SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } @LoadBalanced // 啓用負載均衡服務 @Bean public RestTemplate restTemplate() { return new RestTemplate(); } }
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class UserController { @Autowired RestTemplate restTemplate; @GetMapping("/buy") public String buyTicket(String name) { // 從註冊中心獲取提供方的信息,http://提供方應用的名字/路徑,String類型 String s = restTemplate.getForObject("http://PROVIDER/ticket", String.class); return name + "購買了" + s; } }
如此,咱們的分佈式就說到這裏,這麼看,不是很難理解吧?
P.S:咱們在上邊有一個負載均衡的註解,哪裏能夠看來有什麼做用呢?若是你啓動了8001和8002的兩個服務,能夠經過啓動窗口看到(咱們有在兩個服務中加入不一樣的打印語句),兩個端口分別被調用,輪詢式的均衡調用~