目标
本文的目标是使用spring cloud eureka和spring cloud ribbon快速构建一个简易的分布式结构例子。
- spring cloud eureka
微服务的关键就是把服务切分成比较小且独立的服务,这样做的好处最大的好处就是服务之间的解耦。但也带来很多问题,其中首当其冲的就是服务间的互相调用将会极大的增多。如果不对其加以管理,将会变得非常复杂。而spring cloud Eureka就是为了服务的治理而生的。 - spring cloud Ribbon
服务中心和服务注册只需要eureka就可完成,而Ribbon者提供了服务消费的功能。
Ribbon另一个重要的功能是提供客户端负载均衡的作用。
步骤
我们很快就会发现,使用这些组件都非常简单。一般三个步骤就能完成。
- 创建项目添加依赖
强烈推荐使用Intellij IDEA中的Spring Initializr来构建Spring Cloud工程,IDEA会自动帮你编写好pom。 - 为主类添加注解
- 编写必要的配置
快速构建服务中心
新建项目添加依赖
- 使用Idea创建一个新项目
- 在选择组件时,勾选Cloud Discovery中的Eureka Server
- 在创建好项目之后,我们看下pom.xml文件,这个文件写明了项目依赖的组件,其中我们看到关键的依赖“spring-cloud-starter-netflix-eureka-server”
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
这里需要注意的是,如果我们使用的spring boot的版本大于2.0,依赖包的名称中似乎多了一个“netflix”,这个是开源公司的名称。这就是为什么推荐使用Spring Initializr来构建项目,如果你看网上的其他教程,直接手动引入“spring-cloud-starter-eureka-server”,你会发现死活编译不通过。
主类注解
主类添加注解非常简单,直接在主类添加一个 @EnableEurekaServer 就可以。
必要配置
配置文件是application.properties(注意,有另一种配置文件.yml,效果是一样的,但是格式不一样)
# 每一个服务都需要的名称
spring.application.name=eureka-server
# 每一个服务都需要的端口
server.port=1111
eureka.instance.hostname=localhost
#禁止eureka注册自己,否则会报错,这个在构建多个服务中心时会用到,限制先禁止
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
设置完成后直接启动就可以了。我们访问 localhost:1111 应该就能看到服务中心的界面了。其中红圈的部分就是注册到上面的服务。由于你并没有注册服务,红圈的部分应该是空的。
服务注册
现在,我们就开始把服务注册到服务中心,还是那三个步骤
新建项目添加依赖
选中Cloud Discovery中的Eureka Discovery。
由于需要提供服务,所以还需要一个Api接口,所以还需要引入Web组件
查看pom.xml文件,发现其中Eureka客户端依赖“spring-cloud-starter-netflix-eureka-client”
以及web依赖“spring-boot-starter-web”
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
主类注解
主类添加注解 @EnableDiscoveryClient
配置
# 名称
spring.application.name=server-provide
# 端口
server.port=2001
# 服务注册的地址
eureka.client.service-url.defaultZone=http://127.0.0.1:1111/eureka/
提供服务接口
由于我们需要测试,我们还需要另外提供一个接口。
新建一个class,并添加@RestController注解和@RequestMapping("/")注解。这样,我们就可以通过localhost:2001/HoHoHo 访问得到内容。
@RestController
public class CommonServices {
@RequestMapping("/HoHoHo")
public String GetHoHoHo(){
return "HoHoHo";
}
}
启动项目,重新打开服务中心,应该能看到多了红圈中的内容。这表示注册成功了。
服务发现和消费
现在,以及注册好服务了,可以消费该服务了。
新建项目添加依赖
新建项目,除了和服务提供者医院添加Eureka Client 和web依赖,还需要添加Ribbon依赖,用来消费服务。
一般情况下,服务都既是服务提供者,也是服务消费者。
pom.xml的关键依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
主类注解
添加注解
Eureka需要添加注解@EnableDiscoveryClient
Ribbon不需要添加注解,但是需要配置一下,在主类增加一下代码
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
配置
spring.application.name=server-common
server.port= 5001
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:1111/eureka/
消费服务
@RestController
public class HoController {
//将主类配置的RestTemplate 自动注入到此处
@Autowired
RestTemplate restTemplate;
@GetMapping("/Ho")
public String HoHoHo() {
//通过getForObject去访问对应的服务,这里的server-provide就是在服务提供者注册时配置的服务名称
return restTemplate.getForObject("http://server-provide/HoHoHo", String.class);
}
}
启动
现在我们启动该项目
访问 localhost:5001/Ho,就能够访问到localhost:2001/HoHoHo 接口中的内容。
总结
我们发现,在编写服务消费者的代码时,并不关心服务提供者具体的Ip地址和端口,这样就能够把服务提供者和服务消费者给解耦出来。再加上Ribbon负载均衡,我们就可以轻松的进行服务的拓容。