• Springcloud 学习笔记03-Spring Cloud OpenFeign:基于Ribbon和Hystrix的声明式服务调用


    Spring Cloud OpenFeign 是声明式的服务调用工具,它整合了Ribbon和Hystrix,拥有负载均衡和服务容错功能。

    Feign是声明式的服务调用工具,我们只需创建一个接口并用注解的方式来配置它,就可以实现对某个服务接口的调用,简化了直接使用RestTemplate来调用服务接口的开发量。Feign具备可插拔的注解支持,同时支持Feign注解、JAX-RS注解及SpringMvc注解。当使用Feign时,Spring Cloud集成了Ribbon和Eureka以提供负载均衡的服务调用及基于Hystrix的服务容错保护功能。

    1.创建一个user-service模块

    (1)选择新建module:

      (2)不要选择骨架:

     (3)然后填写模块坐标,我们的模块名称为user-service

    (4)选择安装目录,因为是聚合项目,目录应该是在父工程hztest的下面:

    (5)在pom.xml中添加相关依赖

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

    (6)在application.yml进行配置

    server:
      port: 8201
    spring:
      application:
        name: user-service
    eureka:
      client:
        register-with-eureka: true
        fetch-registry: true
        service-url:
          defaultZone: http://localhost:10086/eureka/

     (7)添加UserController用于提供调用接口

    UserController类定义了对User对象常见的CRUD接口。

    public class UserController {
        private Logger LOGGER = LoggerFactory.getLogger(this.getClass());
    
        @Autowired
        private UserService userService;
    
        @PostMapping("/create")
        public CommonResult create(@RequestBody User user) {
            userService.create(user);
            return new CommonResult("操作成功", 200);
        }
    
        @GetMapping("/{id}")
        public CommonResult<User> getUser(@PathVariable Long id) {
            User user = userService.getUser(id);
            LOGGER.info("根据id获取用户信息,用户名称为:{}",user.getUsername());
            return new CommonResult<>(user);
        }
    
        @GetMapping("/getUserByIds")
        public CommonResult<List<User>> getUserByIds(@RequestParam List<Long> ids) {
            List<User> userList= userService.getUserByIds(ids);
            LOGGER.info("根据ids获取用户信息,用户列表为:{}",userList);
            return new CommonResult<>(userList);
        }
    
        @GetMapping("/getByUsername")
        public CommonResult<User> getByUsername(@RequestParam String username) {
            User user = userService.getByUsername(username);
            return new CommonResult<>(user);
        }
    
        @PostMapping("/update")
        public CommonResult update(@RequestBody User user) {
            userService.update(user);
            return new CommonResult("操作成功", 200);
        }
    
        @PostMapping("/delete/{id}")
        public CommonResult delete(@PathVariable Long id) {
            userService.delete(id);
            return new CommonResult("操作成功", 200);
        }
    }

    2. 创建一个feign-service模块

    (1)在pom.xml中添加相关依赖

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

    (2)在application.yml中进行配置

    server:
      port: 8701
    spring:
      application:
        name: feign-service
    eureka:
      client:
        register-with-eureka: true
        fetch-registry: true
        service-url:
          defaultZone: http://localhost:8001/eureka/

    (3)在启动类上添加@EnableFeignClients注解来启用Feign的客户端功能

    @EnableFeignClients
    @EnableDiscoveryClient
    @SpringBootApplication
    public class FeignServiceApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(FeignServiceApplication.class, args);
        }
    
    }

    (4)添加UserService接口完成对user-service服务的接口绑定

    我们通过@FeignClient注解实现了一个Feign客户端,其中的value为user-service表示这是对user-service服务的接口调用客户端。我们可以回想下user-service中的UserController,只需将其改为接口,保留原来的SpringMvc注释即可。

    @FeignClient(value = "user-service")
    public interface UserService {
        @PostMapping("/user/create")
        CommonResult create(@RequestBody User user);
    
        @GetMapping("/user/{id}")
        CommonResult<User> getUser(@PathVariable Long id);
    
        @GetMapping("/user/getByUsername")
        CommonResult<User> getByUsername(@RequestParam String username);
    
        @PostMapping("/user/update")
        CommonResult update(@RequestBody User user);
    
        @PostMapping("/user/delete/{id}")
        CommonResult delete(@PathVariable Long id);
    }

    (5)负载均衡功能演示

    启动eureka-service,两个user-service,feign-service服务,启动后注册中心显示如下:

    • 启动eureka-server于8001端口;
    • 启动user-service于8201端口;
    • 启动另一个user-service于8202端口,可以通过修改IDEA中的SpringBoot的启动配置实现:

  • 相关阅读:
    java基础 Collections.sort的两种用法
    Mysql常用命令详解
    2、Java并发编程:如何创建线程
    JAR、WAR、EAR的使用和区别
    区分Oracle的数据库,实例,服务名,SID
    Mysql 启动运行
    3、Java并发编程:Thread类的使用
    1、Java多线程基础:进程和线程之由来
    文件上传利器SWFUpload使用指南
    网络矩阵
  • 原文地址:https://www.cnblogs.com/luckyplj/p/15106943.html
Copyright © 2020-2023  润新知