上一篇博客记录了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的后续相关知识,我会慢慢整理补齐。不说了,先把服务关掉,风扇一直在转…