整合SpringCloud

1.关于spring cloud
Spring Cloud是一个分布式的整体解决方案;
Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐, leader选举,分布式session,集群状态)中快速构建的工具;
 
SpringCloud分布式开发五大常用组件
    • 服务发现——Netflix Eureka    ->服务的注册中心,服务提供者将服务的地址注册到注册中心,客户端需要调动服务时,从注册中心中找服务的地址
    • 客服端负载均衡——Netflix Ribbon    ->例如:服务A要调用服务B,B部署了多个实例,A到底要调哪台机器上的B服务
    • 断路器——Netflix Hystrix    ->例如:服务A调服务B,B也调用了C,C调用了D;如果在一次调用中C服务出现了问题,导致一直重试而进入漫长等待,使用断路器可以在几次重试失败后响应失败,从而防止一直等地啊下去;
    • 服务网关——Netflix Zuul    ->用来过滤一些请求;
    • 分布式配置——Spring Cloud Config
 
2.整合spring cloud
新建一个空工程,里面放三个模块:注册中心、服务提供者、服务消费者
 
1)注册中心模块
使用spirng初始化器新建一个模块,选Eureka Server
 
yml配置:
server:
  port: 8761
eureka:
  instance:
    #erueka实例的主机名
    hostname: eureka-server
  client:
    register-with-eureka: false #不把自己注册到erueka上(不做高可用时这么配置)
    fetch-registry: false   #不从erueka上获取服务的注册信息
    service-url:
      defaultZone: http://localhost:8761/eureka/
 
启用注册中心:
    在工程启动类上加注解
@EnableEurekaServer
 
启动注册中心模块的启动类,浏览器访问:localhost:8761,可以看到注册中心管理页面:
 
2)服务提供者
新建一个模块,选Eureka Discover Client
 
主要步骤:
    编写服务接口;
    在yml中配置注册服务;
 
业务类:
@Service
public class SellService {
    public String sell(){
        return "《mzd最后的革命》";
    }
}
controller:
@RestController
public class SellController {
    @Autowired
    private SellService sellService;
 
    @RequestMapping("/sell")
    public String sell(){
        return sellService.sell();
    }
}
yml配置:
server:
  port: 8001
spring:
  application:
    name: provider-server
eureka:
  instance:
    prefer-ip-address: true     #注册服务时,使用服务的ip地址
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/   #注册中心地址
 
测试:
    启动provider服务、访问/sell接口、刷新Eureka注册中心管理页面
可以看到,注册中心管理页面中多了一条服务:
 
也可以个同一个服务提供者在注册中心注册多个实例:
    使用mvn package 将模块打包;
    将打成的jar包复制多份,分别在cmd中使用java -jar xxx命令运行;
 
3)服务消费者
新建一个模块选Eureka Discover Client
 
在启动类中添加注解,开启从注册中心发现服务的功能:
@EnableDiscoveryClient
 
配置类:
    为了请求服务提供者提供的接口,需要用到RestTemplate;
    用@Bean将RestTemplate的实例注册到ioc容器中;
@Configuration
public class BuyConfig {
 
    /**
     * 用来发送http请求
     * @return
     */
    @LoadBalanced   //启用负载均衡机制
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
 
controller:
    调用注册中心中注册的服务来实现业务
@RestController
public class BuyController {
    @Autowired
    private RestTemplate template;
 
    @RequestMapping("/buy")
    public String buy(){
        //使用RestTemplate来发送http请求,
        // 参数1:http:// + eureka中注册的服务名 + 接口名
        //参数2:接口返回值的类型
        String book = template.getForObject("http://PROVIDER-SERVER/sell", String.class);
        return "买到了:" + book;
    }
}
 
yml配置:
server:
  port: 8200
spring:
  application:
    name: consumer
eureka:
  instance:
    prefer-ip-address: true     #注册服务时,使用服务的ip地址
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/   #注册中心地址
 
测试:
    启动消费者服务、刷新注册中心管理页、请求消费接口
结果:
    注册中心中多了消费者服务
    消费者成功调用了服务提供者的接口:
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/ShiningArmor/p/13177020.html