zoukankan      html  css  js  c++  java
  • SpringCloud-创建服务消费者-Feign方式(附代码下载)

    场景

    SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载):

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102535957

    SpringCloud-服务注册与实现-Eureka创建服务提供者(附源码下载):

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102558004

    SpringCloud-创建服务消费者-Ribbon方式(附代码下载):

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102558080

    在上面已经实现服务注册中心、服务提供者和以Ribbon方式实现服务消费者的前提下,使用另一种Feign方式实现服务消费者。

    Feign

    Feign 是一个声明式的伪 Http 客户端,它使得写 Http 客户端变得更简单。使用 Feign,只需要创建一个接口并注解。它具有可插拔的注解特性,可使用 Feign 注解和 JAX-RS 注解。Feign 支持可插拔的编码器和解码器。Feign 默认集成了 Ribbon,并和 Eureka 结合,默认实现了负载均衡的效果

    注:

    博客:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    参考上面构建项目的方式,依次建立目录hello-spring-cloud-web-admin-feign目录以及在

    目录下新建pom.xml,并将其托管。然后新建src/main/java目录和src/main/resources目录并分别进行目录设置。

    然后在java下新建包,包下新建启动类,在resources下新建配置文件application.yml。

    完成后的目录为:

    pom.xml代码:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <parent>
            <groupId>com.badao</groupId>
            <artifactId>hello-spring-cloud-dependencies</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <relativePath>../hello-spring-cloud-dependencies/pom.xml</relativePath>
        </parent>
    
        <artifactId>hello-spring-cloud-web-admin-feign</artifactId>
        <packaging>jar</packaging>
    
        <name>hello-spring-cloud-web-admin-feign</name>
        <url>https://blog.csdn.net/badao_liumang_qizhi</url>
        <inceptionYear>2019-Now</inceptionYear>
    
        <dependencies>
            <!-- Spring Boot Begin -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!-- Spring Boot End -->
    
            <!-- Spring Cloud Begin -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
            <!-- Spring Cloud End -->
    
            <!-- 解决 thymeleaf 模板引擎一定要执行严格的 html5 格式校验问题 -->
            <dependency>
                <groupId>net.sourceforge.nekohtml</groupId>
                <artifactId>nekohtml</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <mainClass>com.badao.hello.spring.cloud.web.admin.feign.WebAdminFeignApplication</mainClass>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </project>

    注:

    这里的parent标签要与上面的统一的依赖管理对应起来。

    要修改指定的程序入口类为自己相应的路径。

    然后应用启动类的代码:

    package com.badao.hello.spring.cloud.web.feign;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableFeignClients
    public class WebAdminFeignApplication {
        public static void main(String[] args) {
            SpringApplication.run(WebAdminFeignApplication.class, args);
        }
    }

    注:

    通过 @EnableDiscoveryClient 注解注册到服务中心

    通过 @EnableFeignClients 注解开启 Feign 功能

    然后是配置文件application.yml

    spring:
      application:
        name: hello-spring-cloud-web-admin-feign
      thymeleaf:
        cache: false
        mode: LEGACYHTML5
        encoding: UTF-8
        servlet:
          content-type: text/html
    
    server:
      port: 8765
    
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/

    注:

    1.服务注册与发现是根据上面的name去寻找。

    2.port表示端口号。

    3.serviceURL设置eureka的地址,与上面创建服务注册中心时的URL对应。

    与使用Ribbon方式不同的是,这里需要创建service接口,而不是service类。

    AdminService接口代码:

    package com.badao.hello.spring.cloud.web.feign.service;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    
    @FeignClient(value = "hello-spring-cloud-service-admin")
    public interface AdminService {
    
        @RequestMapping(value = "hi", method = RequestMethod.GET)
        public String sayHi(@RequestParam(value = "message") String message);
    }

    注:

    通过@FeignClient(value = "hello-spring-cloud-service-admin")来指定调用哪个服务。

    这里就是对应上面服务提供者的配置文件的name属性。

    import com.badao.hello.spring.cloud.web.feign.service.AdminService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class AdminController {
    
        @Autowired
        private AdminService adminService;
    
        @RequestMapping(value = "hi", method = RequestMethod.GET)
        public String sayHi(@RequestParam String message) {
            return adminService.sayHi(message);
        }
    }

    为了体现出负载均衡效果,我们要启动两台service-admin,即启动两个服务提供者。

    我们先启动服务注册中心Eureka服务8761端口,再以8762端口启动一个服务提供者,然后点击Run-Edit Configuration,将启动单实例去掉。

    然后修改服务提供者的配置文件中端口号为8763,再启动一个服务提供者。

    消费者要想实现负载均衡的效果,应该一会访问8762的服务提供者,一会访问8763的服务提供者。

    然后运行当前服务消费者的启动程序。

    打开浏览器输入:

    http://localhost:8765/hi?message=HelloFeign

    此时的架构

    一个服务注册中心,Eureka Server,端口号为:8761
    service-admin 工程运行了两个实例,端口号分别为:8762,8763
    web-admin-feign 工程端口号为:8765

    源码下载

    https://download.csdn.net/download/badao_liumang_qizhi/11867357


     

  • 相关阅读:
    DOM
    Event
    响应式,多列布局
    理解HTML语义化
    类加载过程
    反射
    注解
    线程池
    管程法
    Lock锁
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/11688791.html
Copyright © 2011-2022 走看看