天天看点

实战Spring Cloud微服务治理组件Eureka

文章目录

  • ​​背景​​
  • ​​一、Eureka Server搭建​​
  • ​​1.1 创建Spring Cloud工程​​
  • ​​1.2 修改启动类​​
  • ​​1.2 增加Eureka配置​​
  • ​​1.3 启动Eureka服务器​​
  • ​​二、搭建Eureka服务提供者​​
  • ​​2.1 创建商品服务项目​​
  • ​​2.2 修改启动类​​
  • ​​2.2 增加Eureka Client配置​​
  • ​​2.3 编写商品服务程序​​
  • ​​2.4 启动商品服务​​
  • ​​三、搭建Eureka服务消费者​​
  • ​​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,可以让开发者通过注解的方式实现远程微服务调用,大大简化了代码的编写。