返回

掌握Spring Cloud实战技能,打造高可用微服务系统

后端

构建高可用微服务系统:Eureka、Feign和Hystrix实战

Eureka配置

Eureka客户端

在Spring Boot项目中添加Eureka客户端依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

并在application.yml中配置客户端:

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

serviceUrl替换为Eureka服务端的地址和端口。

Eureka服务端

添加Eureka服务端依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

并在application.yml中配置服务端:

eureka:
  server:
    port: 8761

port替换为服务端的端口。

Feign和Hystrix配置

Feign

添加Feign依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

在远程调用的接口上添加@FeignClient注解:

@FeignClient("service-name")
public interface FeignClientInterface {

    @GetMapping("/hello")
    String hello();
}

"service-name"替换为服务名称。

Hystrix

添加Hystrix依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

并在application.yml中配置Hystrix:

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 1000

timeoutInMilliseconds替换为Hystrix命令的超时时间。

代码示例

Eureka客户端和服务端

客户端:

@SpringBootApplication
@EnableEurekaClient
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

服务端:

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

Feign和Hystrix

Feign客户端:

@FeignClient("service-name")
public interface FeignClientInterface {

    @GetMapping("/hello")
    String hello();
}

使用Feign客户端:

@RestController
public class FeignClientController {

    @Autowired
    private FeignClientInterface feignClientInterface;

    @GetMapping("/hello-feign")
    public String helloFeign() {
        return feignClientInterface.hello();
    }
}

常见问题解答

  1. Eureka服务注册失败怎么办?
    • 检查Eureka服务端是否已启动并运行。
    • 确保Eureka客户端已正确配置,并指定了正确的Eureka服务端地址。
  2. Feign远程调用超时怎么办?
    • 检查服务端是否可用且响应。
    • 增加Hystrix命令的超时时间。
  3. Hystrix熔断机制不生效怎么办?
    • 检查Hystrix配置是否正确,例如超时时间设置。
    • 确保断路器状态监听器已启用。
  4. 服务发现失败怎么办?
    • 确保Eureka客户端和服务端之间存在网络连接。
    • 检查DNS设置是否正确,服务名称是否与Eureka注册表中的一致。
  5. 微服务之间通信延迟高怎么办?
    • 检查网络带宽和延迟。
    • 使用负载均衡或缓存技术减少延迟。