之前,我们使用了Zookeeper+Dubbo(见文章《Spring Boot与分布式Dubbo/Zookeeper》),现在我们整合Spring Cloud来做分布式应用

一、SpringCloud和Dubbo的区别

Dubbo是一个分布式服务框架,主要解决服务与服务之间远程过程调用问题(RPC);而SpringCloud是分布式的整体解决方案。也就是说,在分布式系统中,需要考虑的几乎所以问题,Spring Cloud都有对应的解决方案。

Spring Cloud是一个分布式的整体解决方案。Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐,leader选举,分布式session,集群状态)中快速构建的工具,使用Spring Cloud的开发者可以快速的启动服务或构建应用、同时能够快速和云平台资源进行对接。

SpringCloud 分布式开发五大常用组件

服务发现 ——Netflix Eureka

客服端负载均衡 ——Netflix Ribbon

断路器 ——Netflix Hystrix

服务网关 ——Netflix Zuul

分布式配置 ——Spring Cloud Config

 

 

二、SpringCloud 入门案例

1、注册中心模块  Netflix Eureka

/**
 * 注册中心
 *  1、配置Eureka信息
 *  2、@EnableEurekaServer 启用注册中心的功能
 */
@EnableEurekaServer //启用注册中心的功能
@SpringBootApplication
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

(1)

dubbo与springboot版本对应关系 springboot与dubbo区别_Spring Boot

(2)

server:
  port: 8761

eureka:
  instance:
    hostname: eureka-server # eureka实例的主机名
  client:
    register-with-eureka: false # 不把自己注册到eureka注册中心上
    fetch-registry: false # 不从eureka上来获取服务的注册信息(因为自身就是注册中心)
    service-url:
      defaultZone: http://localhost:8761/eureka

(3) 访问Eureka注册中心的界面

dubbo与springboot版本对应关系 springboot与dubbo区别_zookeeper_02

 

2、服务提供者模块

同时将服务注册到注册中心

Spring Cloud整合微服务,是通过轻量级http进行通信的。

(1)编写service业务和controller

@Service
public class TicketService {
    public String getTicket(){
        return "一张电影票《我喜欢你》";
    }
}
@RestController
public class TicketController {

    @Autowired
    private TicketService ticketService;

    @GetMapping("/get/ticket")
    public String getTicket(){
        String ticket = ticketService.getTicket();
        return ticket;
    }
}

 

(2)将服务提供者的业务注册到Eureka

server:  port: 8001

spring:
  application:
    name: provider-ticket

eureka:
  instance:
    prefer-ip-address: true # 注册服务时使用服务的ip地址
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

(3)启动注册中心和服务提供方

dubbo与springboot版本对应关系 springboot与dubbo区别_Spring Boot_03

 

(4)把同一个应用部署多个实例,注册到注册中心

(1)将服务提供者provider-ticket 打jar包 (maven package)

 

(2)修改服务提供者provider-ticket 的servet端口,再次打包

 

(3) 同一个应用如何在eureka注册中心注册多个

dubbo与springboot版本对应关系 springboot与dubbo区别_eureka_04

dubbo与springboot版本对应关系 springboot与dubbo区别_Spring Boot_05

(4) 

dubbo与springboot版本对应关系 springboot与dubbo区别_eureka_06

 

3、服务消费者模块

如何消费这些服务

(1)配置文件

spring:  application:
    name: comsumer
server:
  port: 8020

# 注册到Eureka
eureka:
  instance:
    prefer-ip-address: true # 注册服务时使用服务的ip地址
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
# 从注册中心发现服务

(2)使用@EnableDiscoveryClient

开启服务发现功能

@EnableDiscoveryClient //开启服务发现功能
@RestController
public class UserController {

    @GetMapping("/buy")
    public String buyTicket(String name){
        return name + "买票成功~";
    }
}

 (3) 消费服务:使用restTemplate请求远程的PROVIDER-TICKET

package com.dhu.comsumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class ComsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ComsumerApplication.class, args);
    }

    @LoadBalanced //启动负载均衡机制
    @Bean
    //发送http请求
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

}
package com.dhu.comsumer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

/**
 * @author zhou
 * @create 2020/6/11
 */
@EnableDiscoveryClient //开启服务发现功能
@RestController
public class UserController {
    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/buy")
    public String buyTicket(String name){
        //消费服务
        String s = restTemplate.getForObject("http://PROVIDER-TICKET/get/ticket", String.class);
        return name + "买票"+s+"成功~";
    }
}

(4)

dubbo与springboot版本对应关系 springboot与dubbo区别_Spring Boot_07

dubbo与springboot版本对应关系 springboot与dubbo区别_zookeeper_08