天天看點

SpringCloud-eureka(叢集版)Eureka叢集原理說明

Eureka叢集原理說明

SpringCloud-eureka(叢集版)Eureka叢集原理說明

1,參考單機版Erueka7001,搭建Eureka7002

2,該pom檔案

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
           

3,修改本地映射路徑

1,找到C:\Windows\System32\drivers\etc路徑下的hosts檔案

2,修改映射配置添加進hosts檔案

3,添加127.0.0.1 eureka7001.com,127.0.0.1 eureka7002.com

4,修改Eureka7001,7002YML檔案(之前是單機,現在配置叢集)

7001yml檔案

server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001.com    #eureka服務端的執行個體名字
  client:
    register-with-eureka: false    #表識不向注冊中心注冊自己
    fetch-registry: false   #表示自己就是注冊中心,職責是維護服務執行個體,并不需要去檢索服務
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka/    #設定與eureka server互動的位址查詢服務和注冊服務都需要依賴這個位址
           

7002yml檔案

server:
  port: 7002

eureka:
  instance:
    hostname: eureka7002.com #eureka服務端的執行個體名字
  client:
    register-with-eureka: false    #表識不向注冊中心注冊自己
    fetch-registry: false   #表示自己就是注冊中心,職責是維護服務執行個體,并不需要去檢索服務
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/     #設定與eureka server互動的位址查詢服務和注冊服務都需要依賴這個位址
 
           

5,把Eureka7001主啟動類上的注解複制到7002上即可啟動7002

6,把服務提供者(8001)注冊到7001和7002上修改8001yml檔案

service-url:
  defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #叢集版
           

7,把服務消費者(80)注冊到Eureka上修改80yml檔案

service-url:
  defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #叢集版
           

8,測試

1,先啟動Eureka 7001和7002服務

2,在啟動8001

3,啟動80

4,通路一個寫好的接口http://localhost/consumer/payment/get/31

5,有傳回值說明叢集搭建成功

9,服務提供者(8001)叢集環境搭建,參照8001建立8002

10,修改8002pom檔案

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
           

11,修改Eureka7001,7002YML

7001yml

server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001.com    #eureka服務端的執行個體名字
  client:
    register-with-eureka: false    #表識不向注冊中心注冊自己
    fetch-registry: false   #表示自己就是注冊中心,職責是維護服務執行個體,并不需要去檢索服務
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka/    #設定與eureka server互動的位址查詢服務和注冊服務都需要依賴這個位址
           

7002yml

server:
  port: 7002

eureka:
  instance:
    hostname: eureka7002.com #eureka服務端的執行個體名字
  client:
    register-with-eureka: false    #表識不向注冊中心注冊自己
    fetch-registry: false   #表示自己就是注冊中心,職責是維護服務執行個體,并不需要去檢索服務
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/     #設定與eureka server互動的位址查詢服務和注冊服務都需要依賴這個位址

           

12 在提供者8001,8002中分别建立一個controller

8001controller

@RestController
@Slf4j
public class PaymentController {
    @Resource
    private PaymentService paymentService;

    @Value("${server.port}")
    private String serverPort;

    @Resource
    private DiscoveryClient discoveryClient;

    @PostMapping("/payment/create")
    public CommonResult create(@RequestBody Payment payment){
        int result = paymentService.create(payment);
        log.info("插入結果"+result);
        if(result>0){
            return new CommonResult(200,"插入結果成功,serverPort: "+serverPort,result);
        }else {
            return new CommonResult(400,"插入結果失敗,serverPort: "+serverPort,null);
        }
    }

    @GetMapping("/payment/get/{id}")
    public CommonResult getPaymentById(@PathVariable("id")Long id){
        Payment paymentById = paymentService.getPaymentById(id);
        log.info("查詢結果"+paymentById);
        if(paymentById!=null){
            return new CommonResult(400,"查詢成功,serverPort: "+serverPort,paymentById);
        }else {
            return new CommonResult(200,"查詢失敗,serverPort: "+serverPort,null);
        }
    }

    @GetMapping("/payment/discovery")
    public Object discovery(){
        List<String> services = discoveryClient.getServices();
        for (String element:services){
            log.info("++++++++++element"+element);
        }
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance:instances){
            log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
        }
        return this.discoveryClient;
    }

    @GetMapping(value = "/payment/lb")
    public String getPaymentLB(){
        return serverPort;
    }

    @GetMapping(value = "/payment/feign/timeout")
    public String paymentFeignTimeout(){
        try{
            TimeUnit.SECONDS.sleep(3);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        return serverPort;
    }
}

           

8002yml

@RestController
@Slf4j
public class PaymentController {
    @Resource
    private PaymentService paymentService;

    @Value("${server.port}")
    private String serverPort;

    @Resource
    private DiscoveryClient discoveryClient;

    @PostMapping("/payment/create")
    public CommonResult create(@RequestBody Payment payment){
        int result = paymentService.create(payment);
        log.info("插入結果"+result);
        if(result>0){
            return new CommonResult(200,"插入結果成功,serverPort: "+serverPort,result);
        }else {
            return new CommonResult(400,"插入結果失敗,serverPort: "+serverPort,null);
        }
    }

    @GetMapping("/payment/get/{id}")
    public CommonResult getPaymentById(@PathVariable("id")Long id){
        Payment paymentById = paymentService.getPaymentById(id);
        log.info("查詢結果"+paymentById);
        if(paymentById!=null){
            return new CommonResult(400,"查詢成功,serverPort: "+serverPort,paymentById);
        }else {
            return new CommonResult(200,"查詢失敗,serverPort: "+serverPort,null);
        }
    }

    @GetMapping("/payment/discovery")
    public Object discovery(){
        List<String> services = discoveryClient.getServices();
        for (String element:services){
            log.info("++++++++++element"+element);
        }
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance:instances){
            log.info(instance.getServiceId()+"\t"+instance.getHost()+"\t"+instance.getPort()+"\t"+instance.getUri());
        }
        return this.discoveryClient;
    }

    @GetMapping(value = "/payment/lb")
    public String getPaymentLB(){
        return serverPort;
    }

    @GetMapping(value = "/payment/feign/timeout")
    public String paymentFeignTimeout(){
        try{
            TimeUnit.SECONDS.sleep(3);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        return serverPort;
    }
}

           

13利用Eureka簡單做一個負載均衡

14,在服務消費放80中寫一個Config

@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced //用于負載均衡機制
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}
           

14,在服務消費者80中寫Controller

@RestController
@Slf4j
public class OrderController {
    //使用與叢集 CLOUD-PAYMENT-SERVICE是生成這在eureka上注冊的名稱
    public static final String PAYMENT_URL="http://CLOUD-PAYMENT-SERVICE";

    @Resource
    private RestTemplate restTemplate;

    @Resource
    private DiscoveryClient discoveryClient;

    @Resource
    private LoadBalancer loadBalancer;

    //postForEntity:傳回對象為postForEntity對象,包含了響應中的一些重要資訊
    //比如相應頭,響應狀态碼,響應體等
    @GetMapping("/consumer/payment/create")
    public CommonResult<Payment> create(Payment payment){
        return restTemplate.postForEntity(PAYMENT_URL+"/payment/create",payment,CommonResult.class).getBody();
    }

    //getForObject傳回對象為響應體中資料裝話成的對象,基本上可以了解為json
    @GetMapping("/consumer/payment/get/{id}")
    public CommonResult<Payment> getPayment(@PathVariable("id") Long id){
        return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
    }
}

           

15,測試結果:http://localhost/consumer/payment/get/2

8001,8002交替出現

SpringCloud-eureka(叢集版)Eureka叢集原理說明
SpringCloud-eureka(叢集版)Eureka叢集原理說明

繼續閱讀