文章目录
- 背景
- 一、Eureka Server搭建
- 1.1 创建Spring Cloud工程
- 1.2 修改启动类
- 1.2 增加Eureka配置
- 1.3 启动Eureka服务器
- 2.1 创建商品服务项目
- 2.2 修改启动类
- 2.2 增加Eureka Client配置
- 2.3 编写商品服务程序
- 2.4 启动商品服务
- 3.1 创建用户服务项目
- 3.2 修改启动类
- 3.3 配置Eureka消费者
- 3.4 创建Restful测试接口,在接口中调用商品微服务
- 3.5 调用Restful接口进行测试
背景
- 分布式微服务架构的核心是对应用按单一职责进行拆分,形成独立部署的服务单元。随着服务的不断水平扩展,需要有专门的服务治理组件来管理和保证微服务的可用性。
- Eureka是Netflix开源微服务框架中专门进行服务发现及治理的组件,Spring Cloud对其进行了二次封装,并与Spring Boot紧密集成。
- 本文将通过实战掌握Eureka基本的使用。
实战Spring Cloud微服务治理组件Eureka
一、Eureka Server搭建
1.1 创建Spring Cloud工程
- 通过Spring网站创建项目
实战Spring Cloud微服务治理组件Eureka - 设置项目属性
实战Spring Cloud微服务治理组件Eureka - 选择Spring Cloud Discovery
实战Spring Cloud微服务治理组件Eureka - 自动生成项目结构及下载jar包
实战Spring Cloud微服务治理组件Eureka
1.2 修改启动类
- 只需要增加@EnableEurekaServer注解,Spring Boot在启动应用的时候就会自动构建一个默认的服务治理服务器。
/**
* Eureka服务启动类
*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
1.2 增加Eureka配置
- 在项目配置文件application.properties中增加Eureka相关配置
# 服务器端口
server.port=8761
# 服务名称
spring.application.name=eureka-server
# 是否将自己注册到Eureka服务中
# 服务本身就是服务治理服务器,而且尚未构建任何服务治理集群,因此将其设置为false
eureka.client.register-with-eureka=false
# 是否从Eureka中获取注册信息
eureka.client.fetch-registry=false
1.3 启动Eureka服务器
- 启动Eureka服务器项目,并通过http://localhost:8761访问Eureka控制台
实战Spring Cloud微服务治理组件Eureka
实战Spring Cloud微服务治理组件Eureka
二、搭建Eureka服务提供者
2.1 创建商品服务项目
- 建立SpringBoot工程
实战Spring Cloud微服务治理组件Eureka - 设置项目名称为goods-service
实战Spring Cloud微服务治理组件Eureka - 勾选Spring Cloud Discovery- Eureka Discovery Client
实战Spring Cloud微服务治理组件Eureka - 增加 spring-boot-starter-web依赖
实战Spring Cloud微服务治理组件Eureka
2.2 修改启动类
- 在应用引导类中增加@EnableDiscoveryClient注解:通过该注解,在Spring Boot启动完毕之后,就会根据配置中的信息尝试与服务治理服务器进行连接,连接成功之后进行服务注册或者服务注册信息的同步。
/**
* 商品服务启动类
*/
@EnableEurekaClient
@SpringBootApplication
public class GoodsServiceApplication {
public static void main(String[] args) {
SpringApplication.run(GoodsServiceApplication.class, args);
}
}
2.2 增加Eureka Client配置
# 服务器端口
server.port=8080
# 服务名称
spring.application.name=goods-service
# 是否将自己注册到Eureka服务中: 服务需要向服务治理服务器进行注册
eureka.client.register-with-eureka=true
# 是否从Eureka中获取注册信息:启动时从服务治理服务器拉取信息
eureka.client.fetch-registry=true
#Eureka客户端与Eureka服务端进行交互的地址
eureka.client.service-url.defaultZone=http://172.22.34.63:8761/eureka
2.3 编写商品服务程序
/**
* 商品服务-模拟返回商品列表
*/
@RestController
@RequestMapping("api/goods")
public class GoodsService {
// 返回商品列表
@GetMapping
public List<Goods> getAllGoods() {
List<Goods> goods = new ArrayList<>();
goods.add(new Goods("电脑", 10));
goods.add(new Goods("手机", 20));
goods.add(new Goods("书籍", 30));
return goods;
}
}
/**
* 商品类
*/
public class Goods implements Serializable {
// 商品名称
private String name;
// 商品价格
private Integer number;
public Goods(String name, Integer number) {
this.name = name;
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
}
2.4 启动商品服务
- 启动该工程项目,并通过Eureka控制台观察商品服务是否已在服务治理服务器进行注册
实战Spring Cloud微服务治理组件Eureka - 注册成功
实战Spring Cloud微服务治理组件Eureka
三、搭建Eureka服务消费者
3.1 创建用户服务项目
- 项目命名为user-consumer
实战Spring Cloud微服务治理组件Eureka - 勾选Spring Cloud Discovery- Eureka Discovery Client
实战Spring Cloud微服务治理组件Eureka - 增加 spring-boot-starter-web依赖
3.2 修改启动类
- 在应用引导类中增加@EnableDiscoveryClient注解:通过该注解,在Spring Boot启动完毕之后,就会根据配置中的信息尝试与服务治理服务器进行连接,连接成功之后可以向服务治理服务器获取服务列表。
- 创建一个RestTemplate Bean,加上@LoadBalanced注解,让消费者通过Eureka服务器中注册的服务名访问服务提供者。
/**
* 用户消费者启动类
*/
@EnableEurekaClient
@SpringBootApplication
public class UserConsumerApplication {
// 向Spring注册一个RestTemplate Bean
@Bean
// 必须加入 @LoadBalanced注解,否则不能以Eureka中注册的服务名进行访问
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(UserConsumerApplication.class, args);
}
}
3.3 配置Eureka消费者
server.port=8081
spring.application.name=user-consumer
# 向eureka服务器获取服务列表
eureka.client.fetch-registry=true
#Eureka客户端与Eureka服务端进行交互的地址
eureka.client.service-url.defaultZone=http://172.22.34.63:8761/eureka
# 调用商品服务的地址
goods-service.url=http://GOODS-SERVICE/
3.4 创建Restful测试接口,在接口中调用商品微服务
/**
* 用户消费者--调用eureka服务器中的商品服务,并对外提供RestFul接口测试
*/
@RestController
@RequestMapping("user/")
public class UserConsumer {
@Autowired
private RestTemplate restTemplate;
@Value("${goods-service.url}")
private String url;
@GetMapping("/goods")
public User getUserGoods() {
User user = new User();
// 调用商品微服务
Object response = restTemplate.getForEntity(url + "api/goods", Object.class).getBody();
try {
user.setName("jack");
user.setGoods((List<GoodsDTO>) response);
} catch (Exception e){
throw new RuntimeException(e.getMessage());
}
return user;
}
}
/**
* 用户类
*/
public class User implements Serializable {
private String name;
private List<GoodsDTO> goods;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<GoodsDTO> getGoods() {
return goods;
}
public void setGoods(List<GoodsDTO> goods) {
this.goods = goods;
}
}
/**
* 商品数据传输类
*/
public class GoodsDTO {
private String name;
private Integer number;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
}
3.5 调用Restful接口进行测试
小结
- 按搭建服务治理服务器、微服务提供者、微服务消费者三个步骤进行了实战演示。
- Eureka Server 环境一般都需要部署至少两个server,通过配置实现互相向对方注册,保证服务治理中心的高可用性。
- 服务治理还会结合客户端负载均衡组件Ribbon,保证微服务调用的高性能。
- 在以上文章中仅是通过RestTemplate实现了服务消费者向提供者,但实际生产项目中会引入Feign,可以让开发者通过注解的方式实现远程微服务调用,大大简化了代码的编写。