SpringBoot学习之路---SpringBoot整合SpringCloud(Eureka&服务提供和消费)

上一篇博客记录了SpringCloud为我们提供了分布式一站式的解决方案,其中有个组件Eureka,它的作用是作为一个注册中心,服务提供者可以把服务注册到它上面,而服务消费者可以通过http协议的restful风格请求方式去获取该服务,这一篇博客主要介绍SpringBoot怎么去整合Eureka作为注册中心。


我们要编写这种分布式的应用,那么就要创建一个空工程,再往里面添加各种模块,那么先创建一个空工程:

在这里插入图片描述

这里我们有一个应用场景,假设有一个买票模块,它负责提供售票服务,另外有一个用户模块。浏览器访问用户模块,用户模块再去远程调用售票模块的服务,之后用户模块把结果返回给浏览器。大致逻辑就这样,那我们开动吧。

环境搭建:

这里需要创建三个模块,分别是用户模块(consumer_user)、售票模块(provider_ticket)还有一个注册中心(eureka_server)也是一个模块。这个要注意了,和之前的Dubbo可不一样。

Eureka模块创建时要导入这个依赖(eureka server),这里就使用Spring initializr来导入了,后续两个模块相同:

在这里插入图片描述

用户模块创建要导入的依赖(由于售票模块需要导入的依赖也相同,这里就略过了):

在这里插入图片描述

三个项目创建完成之后:

在这里插入图片描述

Eureka模块:

环境弄好之后,先来把Eureka模块搞定吧。因为SpringBoot导入了相关依赖,会有自动配置类帮我们自动配置组件,java代码方面不用我们管,所以我们可以直接去全局配置文件(application.yaml)中配置即可:

server:
  port: 8761
eureka:
  instance:
    hostname: eureka_server
  client:
    register-with-eureka: false #不把自己注册到eureka
    fetch-registry: false #不从eureka上获取服务的具体信息
    service-url:
      defaultZone: http://localhost:8761/eureka/

这里解释一下一些配置

  • register-with-eureka: false,目的是不把注册中心注册到注册中心上…(因为现在我们需求还用不到)
  • fetch-registry: false,不获取服务的具体信息,因为注册中心不是服务消费者,所以还不用去获取具体信息,只管注册即可。
  • service-url.defaultZone: http://localhost:8761/eureka/, 这个属性是eureka注册中心的地址,是选配的,如果我们不配的话,它是有一个默认值,默认值是啥也忘记了…

还有一步别忘了,在该模块的主启动类上加上@EnableEurekaServer注解,之后运行主启动类,访问localhost:8761/,如果出现以下界面,则代表eureka模块搞定:

在这里插入图片描述

可以看到在界面中有Instances currently registered with Eureka这一栏,这一栏是当前注册中心有哪些应用,我们目前还没有。

provider_ticket:

这个模块就一个ticketService接口,里面有一个getTicket()方法,并在实现类中实现它.同时为了其他模块可以远程调用,需要一个controller层.

ticketService接口:

public interface ticketService {
    
    public String getTicket();
}

实现类ticketServiceImpl:

@Service
public class TicketServiceImpl implements TicketService {
    @Override
    public String getTicket() {
        return "《我爱你,中国》";
    }
}

TicketController:

@RestController
public class TicketController {

    @Autowired
    private TicketService ticketService;

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

业务编写好了,接下来就去配置文件做一些配置:

server:
  port: 8001
spring:
  application:
    name: provider_ticket

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

这里url地址就填我们刚刚eureka的地址,这样服务就注册上去了.

在主启动类上加上@EnableEurekaClient注解

我们启动项目,注意这个过程中刚刚的eureka模块不能关闭 ,接着访问local:8761/

在这里插入图片描述

可以看到Instances currently registered with Eureka那一块已经有provider_ticket了。

consumer_user:

接下来只剩下服务消费者模块了。里面有一个UserService接口,其中有一个方法buyTicket(),并在实现类中实现它。为了测试直观,也加上controller,这里代码略过。

这里因为eureka是基于http的resetful风格来管理服务的,所以我们需要一个类RestTemplate,编写一个配置类并把它注入到容器中:

@Configuration
public class EurekaConfiguration {
    
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

UserService接口:

public interface UserService {

    public String buyTicket();
}

UserServiceImpl实现类:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private RestTemplate restTemplate;

    @Override
    public String buyTicket() {

        String forObject = restTemplate.getForObject("http://localhost:8001/getTicket", String.class);

        return "买到票了:"+forObject;
    }
}

UserController:


Java代码部分编写完成,还是一个套路,编写全局配置文件中的一些配置:

server:
  port: 8002
spring:
  application:
    name: consumer_user

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

我们可以发现这个配置文件和售票模块的配置文件一样,也就是说我们也把用户模块注册上去了,那用户模块怎么去调用呢?这就需要在用户模块的主启动类上添加这个注解了@EnableDiscoveryClient.

之后运行该模块,访问localhost:8002/buyTicket 请确保前两个模块都开启!

在这里插入图片描述

可以看到远程调用成功了,并在eureka的Instances currently registered with Eureka中可以看到,有两个模块了:

在这里插入图片描述

到这里整合成功了,有关SpringCloud的后续相关知识,我会慢慢整理补齐。不说了,先把服务关掉,风扇一直在转…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章