SpringBoot日記——分佈式篇

  思考:什麼是分佈式?什麼是微服務?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

  Zookeeper+Dubbo

  官方看文檔,或者網搜相關部署,好比:https://www.cnblogs.com/jaycekon/p/SpringBootDubbo.htmlapp

  這篇文章主要以這個爲主來說,上邊的本身看吧,有須要我再單獨補文章~負載均衡

SpringBoot+SpringCloud

  Cloud與Dubbo的區別,Dubbo解決的就是遠程過程調用的RPC服務,而Cloud更全面,它有一整套的分佈式須要的對應的解決方案:配置管理、服務發現、熔斷、路由、微代理、控制總線、一次性token、全局鎖、leader選舉、分佈式session、集羣狀態。因此使用Cloud能夠更快速的與雲平臺進行對接。框架

  SpringCloud五大經常使用組件:分佈式

    • 服務發現-Netflix Eureka
    • 客服端負載均衡-Netflix Ribbon
    • 斷路器-Netflix Hystrix
    • 服務網關-Netflix Zuul
    • 分佈式配置-SpringCloudConfig

  那麼咱們來看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 "《大鯊魚》";
    }
}
service.TicketService
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();
    }
}
controller.TicketController
server:
  port: 8001  #提供方的啓動端口
spring:
  application:
    name: provider
eureka:
  instance:
    prefer-ip-address: true #註冊服務的時候使用服務ip地址
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
application.yml

    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
application.yml
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();
    }
}
ConsumerApplication
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;
    }
}
controller.UserController

  如此,咱們的分佈式就說到這裏,這麼看,不是很難理解吧?

  P.S:咱們在上邊有一個負載均衡的註解,哪裏能夠看來有什麼做用呢?若是你啓動了8001和8002的兩個服務,能夠經過啓動窗口看到(咱們有在兩個服務中加入不一樣的打印語句),兩個端口分別被調用,輪詢式的均衡調用~

相關文章
相關標籤/搜索