springCloud 服务调用openFeign

简介

目标

  • 使用openFeign演示负载均衡以及服务容错功能
  • openFeign添加日志打印功能

OpenFeign介绍

参考文档:OpenFeign和Ribbon比较

  • Spring Cloud OpenFeign 是声明式的服务调用工具,它整合了Ribbon和Hystrix,拥有负载均衡和服务容错功能。
  • OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解。

创建父工程

创建父工程springcloud_openfeign

  • 打开软件idea,新建项目->左侧选择Spring Initializr 后选择jdk的版本。
  • 配置项目信息,注意Type要选择Maven POM,选择project的话,它会帮你生成整个完整的工程结构;选择pom的话,它只会在工程目录下生成pom.xml,而没有src等等结构。
  • 不选择依赖,直接下一步完成

负载均衡

eureka_service(注册中心)

在父工程下面创建注册中心eureka_service模块

  • 在项目上右键>New>Module, 配置Group要跟最外层的一样,前面创建跟之前的一样,Type选择Maven Project.
  • 添加依赖Spring Cloud Discovery -> Eureka Server 依赖
  • 安装位置:在父工程目录下新建一个eureka_service文件夹

启动类

在启动类上添加@EnableEurekaServer注解来启用Euerka注册中心功能

配置文件

server:
  #指定运行端口
  port: 8080
spring:
  application:
    # 指定服务名称
    name: eureka-service

eureka:
  instance:
    # 指定主机地址
    hostname: localhost
  client:
    #指定是否要从注册中心获取服务(注册中心不需要开启)
    fetch-registry: false
    #指定是否要注册到注册中心(注册中心不需要开启)
    register-with-eureka: false
  server:
    #关闭保护模式
    enable-self-preservation: false

user_service(http接口)

在父工程下面创建用户服务user_service模块

  • 在项目上右键>New>Module, 配置Group要跟最外层的一样,前面创建跟之前的一样,Type选择Maven Project.
  • 添加依赖Web->Spring Web 依赖
  • 安装位置:在父工程目录下新建一个user_service文件夹

修改启动类

如果在创建项目的时候没有添加依赖可以在pom.xml中补上eureka-client依赖

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

在启动类添加注解

@EnableDiscoveryClient

UserController

新建controller目录在该目录下新建控制了UserController类。

package indi.xzw.user_service.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @GetMapping("/user")
    public String getUser(){
    	System.out.println("get User");
        return "xiazhongwei";
    }
}

配置文件

因为我们需要启动多个user_service来测试负载均衡,所以采用同一工程根据不同配置文件启动多实例的方式模拟。

application-01.yaml

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

application-02.yaml

server:
  port: 7071
spring:
  application:
    name: user-service
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:8080/eureka/
  • 进入配置界面,选择左上角 + 号,

  • 并依次填入启动配置的名字:user-01 (随意取)

  • 选择工程的启动类:indi.xzw.user_service.UserServiceApplication

  • 输入启动参数:--spring.profiles.active=01 ( --spring.profiles.active=是固定格式,01 是用以指定调用的配置文件)

106

同理配置02启动项,这样我们可以分别启动user-01,user-02两个模块

feign_service(服务调用)

在父工程下面创建feign_service模块

  • 在项目上右键>New>Module, 配置Group要跟最外层的一样,前面创建跟之前的一样,Type选择Maven Project.
  • 添加依赖Spring Cloud Discovery -> Eureka Discovery Client , Spring Cloud Routing->OpenFeign,Web->Spring Web依赖。
  • 安装位置:在父工程目录下新建一个feign_service文件夹

修改启动类

添加注解

@EnableFeignClients
@EnableDiscoveryClient

配置文件

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

UserService

新建service文件夹并在文件夹下新建接口UserService

//@FeignClient中的value是要调用的服务的注册名,即在eureka的注册名。
//FeignClient的 Request路径,方法和参数要和被调用的Rest服务保持一致。
@FeignClient(value ="user-service" )
public interface UserService {

    @GetMapping("/user")
    public String getUser();
}
  • @FeignClient:指定调用哪个服务,会通过eureka 来找到该服务的url,通过组成完整的url,来http调用

  • @FeignClient里面的value的值要和我们调用的服务user_service配值文件中的spring.application.name一致

  • 这个接口里面的方法和参数也和user_service里面的保持一致

UserController

新建controller文件夹并在文件夹下新建类UserController

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/getFeignUser")
    public String getFeignUser(){
        return userService.getUser();
    }
}

运行

  • 启动注册中心eureka_service

  • 启动user-01 user-02

  • 启动feign_service

  • 访问注册中心就可以看到feign_service user-01 user-02 都已经成功注册

107

容错保护

开启容错保护功能

修改feign_service 配置文件application.yml,开启容错保护功能功能

feign:
  circuitbreaker:
    enabled: true

老的版本使用的是feign.hystrix.enabled,新版本已经去掉hystrix使用circuitbreaker替代

添加circuitbreaker依赖,如果只修改配置文件不添加依赖同样不会生效

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
            <version>2.0.0</version>
        </dependency>

保护类

在UserService接口上实现一个保护类UserProtectedServiceImpl,这个类的作用是在调用服务失败后降级调用这个保护类实现的服务

package indi.xzw.feign_client.service.impl;

import indi.xzw.feign_client.service.UserService;
import org.springframework.stereotype.Component;

@Component
public class UserProtectedServiceImpl implements UserService {
    @Override
    public String getUser(){
        return "服务降级";
    }

}

修改UserService

修改UserService接口中的@FeignClient注解的参数,设置服务降级处理类为UserProtectedServiceImpl

@FeignClient(value ="user-service" ,fallback = UserProtectedServiceImpl.class)

运行

日志

config

在feigen_service中新建config目录,并在该目录下新建FeignConfig配置类

package indi.xzw.feign_client.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import feign.Logger;

@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }
}

配置

在feigen_service配置中添加

logging:
  level:
    indi.xzw.feign_client.service.UserService: debug

配置UserService的日志级别为debug。

运行

重新运行,会发现打印UserService日志

108

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×