【SpringCloud】1.一文带你入门SpringCloud微服务

news2024/11/23 13:32:02

文章目录

    • 1. 搭建父工程
    • 2. 搭建注册中心
    • 3. 搭建一个服务提供者
    • 4. 搭建一个服务消费者
    • 5. 整合OpenFeign实现服务之间的调用

1. 搭建父工程

最近打算使用 springcloud 搭建微服务玩一下,用到的东西大致有以下这些:

  • jdk 1.8
  • idea 2019
  • maven 3.6.3
  • springcloud 2021.0.3
  • springboot 2.6.14
  • mysql 8.0
  • mybatis-plus 3.5.1

这里需要注意的是,springcloud 的版本和 springboot 的版本要能匹配,不然会出现问题,没法使用。由于我这里已经搭建好了开发环境,所以我们直接开始父工程的搭建。

第一步,非常简单,打开 idea ,新建一个 maven 项目,配置什么的一切默认,项目名字改为自己定义的就好,我这里直接把项目名字写为 springcloud ,这就是我们的父工程了。

第二步,将项目中的 src 这个包删除掉,仅保留 .idea 、pom.xml、springcloud.iml 这三个文件。

第三步,在 pom.xml 文件中,加入依赖,将我们需要的包导入进来,下面是整个 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>

    <groupId>com.yuhuofei</groupId>
    <artifactId>springcloud</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>springcloud-eureka</module>
        <module>springcloud-service-provider</module>
        <module>springcloud-service-consumer</module>
    </modules>

    <!--打包方式-->
    <packaging>pom</packaging>

    <!--版本号配置-->
    <properties>
        <spring-boot.version>2.6.14</spring-boot.version>
        <spring-cloud.version>2021.0.3</spring-cloud.version>
        <java.version>1.8</java.version>
        <mybatis-plus-spring-boot.version>3.5.1</mybatis-plus-spring-boot.version>
        <mysql.version>8.0.11</mysql.version>
        <druid.version>1.2.11</druid.version>
        <lombok.version>1.18.22</lombok.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!--springcloud依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--springboot依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--mybatisPlus依赖-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus-spring-boot.version}</version>
            </dependency>

            <!--mysql驱动依赖 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>

            <!--druid依赖-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>${druid.version}</version>
            </dependency>

            <!-- lombok依赖 -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>

            <!-- test依赖,用于测试 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <version>${spring-boot.version}</version>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <!-- springboot打包插件,将代码打包成一个jar包 -->
    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

至此,整个父工程的搭建工作大致就完成了,下图是我已经搭建完服务消费者的项目结构,供参考。

在这里插入图片描述

2. 搭建注册中心

注册中心,我这里采用 eureka ,其它可以作为注册中心的组件还有 zookeeper、consul、nacos 等。

在前面的父工程里面,新建一个 module ,类型选择 Maven,名字写为 springcloud-eureka ,其它配置一切默认直至完成,这就是我们注册中心所在的服务了。

第一步,在自己的 pom.xml 文件中,引入依赖,整个 pom.xml 文件的内容如下所示,由于这个 module 只是作为注册中心,所以引入 eureka 服务端的依赖就可以了,版本选择的是 3.1.3 ,需要和前面选择的 springcloud 版本相匹配。

<?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">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>com.yuhuofei</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>springcloud-eureka</artifactId>

    <dependencies>
        <!--注册中心eureka服务端的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
            <version>3.1.3</version>
        </dependency>
        <!--以下是springboot相关依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <!--打包时,指定包名-->
    <build>
        <finalName>springcloud-eureka</finalName>
    </build>
</project>

第二步,新增一个启动类,我这里新建了一个 com.yuhuofei 的包,并将启动类 SpringCloudEurekaApplication.java 写在了这个包下,内容如下所示,注意需要加上注解 @EnableEurekaServer 以开启 eureka 服务端的使用。

package com.yuhuofei;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * @Description
 * @ClassName SpringCloudEurekaApplication
 * @Author yuhuofei
 * @Date 2023/5/22 18:56
 * @Version 1.0
 */
@EnableEurekaServer
@SpringBootApplication
public class SpringCloudEurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudEurekaApplication.class, args);
    }
}

第三步,增加配置文件,在 resource 目录下,新建一个 application.properties 文件,内容如下所示。

#服务启动端口
server.port=8000
#服务名称
spring.application.name=springcloud-eureka

#========下面是eureka配置========#
#eureka服务端实例名称
eureka.instance.hostname=eureka-server
#不向注册中心注册当前服务
eureka.client.register-with-eureka=false
#当前服务是注册中心所在服务,负责维护所有服务实例,不需要检查服务
eureka.client.fetch-registry=false
#注册中心地址,当其它微服务连接注册中心时,需要这个地址
eureka.client.service-url.defaultZone=http://localhost:8000/eureka/

到这里,注册中心的搭建,我们就完成了,整个 module 的结构如下图所示,非常简单,不复杂。

在这里插入图片描述
下面,我们启动一下启动类,并在浏览器访问 http://localhost:8000/ 看看结果,可以看到,一切如我们所料。

在这里插入图片描述

3. 搭建一个服务提供者

在父工程的基础上,新建一个 module ,类型选择 Maven,名字写为 springcloud-service-provider ,其它配置一切默认直至完成。

由于需要用到数据库,因此需要自己建立一个数据库以及数据库表,我这里随便建了一个 user 表,内容如下:

CREATE TABLE `user` (
  `id` int(20) NOT NULL,
  `name` varchar(30) COLLATE utf8_bin DEFAULT NULL,
  `password` varchar(30) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

在这里插入图片描述
在自身的 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">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>com.yuhuofei</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-service-provider</artifactId>
    <dependencies>
        <!--eureka客户端的依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>3.1.3</version>
        </dependency>

        <!--加入mysql依赖 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--druid依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
        <!-- lombok依赖 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--mybatisPlus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>

        <!--以下是springboot相关依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>springcloud-service-provider</finalName>
    </build>

</project>

新建一个包 com.yuhuofei,然后在这个包下新建一个启动类 SpringCloudServiceProviderApplication.java,内容如下所示,这里要注意开启 Eureka 客户端的支持。

package com.yuhuofei;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * @Description
 * @ClassName SpringCloudServiceProviderApplication
 * @Author yuhuofei
 * @Date 2023/5/22 18:56
 * @Version 1.0
 */
@SpringBootApplication
@EnableEurekaClient
public class SpringCloudServiceProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudServiceProviderApplication.class, args);
    }
}

后面就是依次新建 controller 、entity、mapper、service 相关的东西了,这里我直接贴出来各个类或者接口的内容。

  • UserController.java
package com.yuhuofei.controller;

import com.yuhuofei.entity.User;
import com.yuhuofei.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @Description
 * @ClassName UserController
 * @Author yuhuofei
 * @Date 2023/5/22 19:56
 * @Version 1.0
 */
@RestController
@RequestMapping("/provider/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/list")
    public List<User> queryAllUser() {
        return userService.queryUserList();
    }
}

  • User.java
package com.yuhuofei.entity;

import lombok.Data;

import java.io.Serializable;

/**
 * @Description
 * @ClassName User
 * @Author yuhuofei
 * @Date 2023/5/22 19:49
 * @Version 1.0
 */
@Data
public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    private Integer id;

    private String name;

    private String passWord;
}

  • UserMapper.java
package com.yuhuofei.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yuhuofei.entity.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

/**
 * @Description
 * @InterfaceName UserMapper
 * @Author yuhuofei
 * @Date 2023/5/22 19:55
 * @Version 1.0
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {

    List<User> queryUserList();
}

  • userMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.yuhuofei.mapper.UserMapper">
    <resultMap id="userResultMap" type="com.yuhuofei.entity.User">
        <result column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="password" property="passWord"/>
    </resultMap>

    <sql id="Base_Column_List">
        id,name,password
    </sql>

    <select id="queryUserList" resultType="com.yuhuofei.entity.User">
        select id,name,password
        from user
        where id is not null;
    </select>

</mapper>

  • UserService.java
package com.yuhuofei.service;

import com.yuhuofei.entity.User;

import java.util.List;

/**
 * @Description
 * @InterfaceName UserService
 * @Author yuhuofei
 * @Date 2023/5/22 19:57
 * @Version 1.0
 */
public interface UserService {

    List<User> queryUserList();
}

  • UserServiceImpl.java
package com.yuhuofei.service.impl;

import com.yuhuofei.entity.User;
import com.yuhuofei.mapper.UserMapper;
import com.yuhuofei.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @Description
 * @ClassName UserServiceImpl
 * @Author yuhuofei
 * @Date 2023/5/22 19:58
 * @Version 1.0
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> queryUserList() {
        return userMapper.queryUserList();
    }
}

最后在 resource 目录下,新建一个 application.properties 文件,写入配置信息,内容如下:

#服务启动端口
server.port=8001
#服务名称
spring.application.name=springcloud-service-provider
#数据库连接配置
spring.datasource.username=root
spring.datasource.password=pan
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#MybatisPlus配置
mybatis-plus.type-aliases-package=com.yuhuofei.entity
mybatis-plus.mapper-locations=classpath:mapper/*.xml
mybatis-plus.configuration.map-underscore-to-camel-case=true
#========下面是eureka配置========#
#向注册中心注册当前服务
eureka.client.register-with-eureka=true
#当前服务需要获取注册中心已经存在的注册信息,所以需要检查服务
eureka.client.fetch-registry=true
#注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8000/eureka/

整个服务提供者的目录结构如下图所示,到这里服务提供者的搭建就完成了。

在这里插入图片描述

4. 搭建一个服务消费者

服务消费者的搭建,和前面服务提供者的搭建类似,我这里搭建一个名为 springcloud-service-consumer 的服务消费者,整个 module 的结构如下图所示。

在这里插入图片描述
由于这个服务里面没有用到数据库的东西,所以不用整合 MybatisPlus 以及 MySQL 相关的东西,下面是各个相关的文件信息。

  • 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">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>com.yuhuofei</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-service-consumer</artifactId>

    <dependencies>
        <!--eureka客户端的依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>3.1.3</version>
        </dependency>
        <!-- lombok依赖 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--以下是springboot相关依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <finalName>springcloud-service-consumer</finalName>
    </build>
</project>
  • SpringCloudServiceConsumerApplication.java
package com.yuhuofei;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * @Description
 * @ClassName SpringCloudServiceConsumerApplication
 * @Author yuhuofei
 * @Date 2023/5/22 18:59
 * @Version 1.0
 */
@SpringBootApplication
@EnableEurekaClient
public class SpringCloudServiceConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudServiceConsumerApplication.class, args);
    }
}

  • application.properties
#服务启动端口
server.port=8002
#服务名称
spring.application.name=springcloud-service-consumer

#========下面是eureka配置========#
#向注册中心注册当前服务
eureka.client.register-with-eureka=true
#当前服务需要获取注册中心已经存在的注册信息,所以需要检查服务
eureka.client.fetch-registry=true
#注册中心地址
eureka.client.service-url.defaultZone=http://localhost:8000/eureka/
  • PersonInfo.java
package com.yuhuofei.entity;

import lombok.Data;

import java.io.Serializable;

/**
 * @Description
 * @ClassName PersonInfo
 * @Author yuhuofei
 * @Date 2023/5/23 18:54
 * @Version 1.0
 */
@Data
public class PersonInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    private Integer id;

    private String name;

    private String passWord;
}

  • RestTemplateConfig.java

这个类主要是提供一个 RestTemplate 的 bean 并交给 Spring 去托管

package com.yuhuofei.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @Description
 * @ClassName RestTemplateConfig
 * @Author yuhuofei
 * @Date 2023/5/23 18:45
 * @Version 1.0
 */
@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

  • ConsumerController.java

这个类里面用到 RestTemplate 来实现 http 接口的调用,在当前这个服务消费者里面调用服务提供者的接口。

package com.yuhuofei.controller;

import com.yuhuofei.entity.PersonInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * @Description
 * @ClassName ConsumerController
 * @Author yuhuofei
 * @Date 2023/5/23 18:55
 * @Version 1.0
 */
@RestController
@RequestMapping("/consumer/person")
public class ConsumerController {

    public static final String PROVIDER_URL = "http://localhost:8001/";

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/list")
    public List<PersonInfo> getPersonList() {
        return restTemplate.getForObject(PROVIDER_URL + "provider/user/list", List.class);
    }
}

到这里,我们就可以启动前面的服务提供者,然后再启动当前的服务消费者,接着在浏览器中访问 http://localhost:8002/consumer/person/list ,看看有没有数据出现,如果有,说明目前一切都是 OK 的。

至于目录中的 api 这个包,是后面整合 feign 客户端用的,这里暂时不用理会。

5. 整合OpenFeign实现服务之间的调用

前面我们已经实现了服务消费者调用服务提供者的接口,但是是通过 RestTemplate 这种方式来调用的,这是类似于单体服务的调用,并没有和我们说的微服务、注册中心等东西关联上,现在我们来改造一下,用 OpenFeign 实现微服务间的调用,与注册中心关联上。

在上面的服务消费者中,我们已经建了一个 api 的包,包里面后面要写一个接口 FeignServiceApi.java ,它的作用就是用来关联服务提供者的各个接口的。

下面我们在服务消费者 springcloud-service-consumer 的基础上,整合一下 OpenFeign 。

第一步,在 pom.xml 中引入下面的依赖

<!-- 增加openfeign依赖 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>3.0.2</version>
</dependency>

完整的 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">
    <parent>
        <artifactId>springcloud</artifactId>
        <groupId>com.yuhuofei</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-service-consumer</artifactId>

    <dependencies>
        <!--eureka客户端的依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>3.1.3</version>
        </dependency>
        <!-- lombok依赖 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--以下是springboot相关依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- 增加openfeign依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>3.0.2</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>springcloud-service-consumer</finalName>
    </build>
</project>

第二步,在启动类 SpringCloudServiceConsumerApplication.java 上,加上注解 @EnableFeignClients ,开启 feign 客户端支持。

package com.yuhuofei;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @Description
 * @ClassName SpringCloudServiceConsumerApplication
 * @Author yuhuofei
 * @Date 2023/5/22 18:59
 * @Version 1.0
 */
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class SpringCloudServiceConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudServiceConsumerApplication.class, args);
    }
}

第三步,在接口 FeignServiceApi.java 中,加上注解 @FeignClient ,并指定要调用的服务提供者名称为 springcloud-service-provider ,接着就是在里面写上要调用的接口信息,内容如下:

package com.yuhuofei.api;

import com.yuhuofei.entity.PersonInfo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;

/**
 * @Description feign调用服务提供者的接口
 * @InterfaceName FeignServiceApi
 * @Author yuhuofei
 * @Date 2023/5/23 19:26
 * @Version 1.0
 */
@Service
@FeignClient("springcloud-service-provider")
public interface FeignServiceApi {

    //调用服务提供者的接口
    @GetMapping("/provider/user/list")
    List<PersonInfo> queryAllUser();
}

第四步,为了和前面做出区分,我们在 ConsumerController.java 中,新增一个方法 getPersonListUseOpenFeign ,这个方法就通过 openfeign 来实现服务间的接口调用,为了更好地跟踪,我们加上日志打印。

package com.yuhuofei.controller;

import com.yuhuofei.api.FeignServiceApi;
import com.yuhuofei.entity.PersonInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * @Description
 * @ClassName ConsumerController
 * @Author yuhuofei
 * @Date 2023/5/23 18:55
 * @Version 1.0
 */
@RestController
@RequestMapping("/consumer/person")
@Slf4j
public class ConsumerController {

    public static final String PROVIDER_URL = "http://localhost:8001/";

    @Autowired
    private FeignServiceApi feignServiceApi;

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/list")
    public List<PersonInfo> getPersonList() {
        return restTemplate.getForObject(PROVIDER_URL + "provider/user/list", List.class);
    }

    @GetMapping("/list-by-openfeign")
    public List<PersonInfo> getPersonListUseOpenFeign() {
        log.info("通过openfeign调用");
        List<PersonInfo>  list = feignServiceApi.queryAllUser();
        log.info("得到的列表:{}",list);
        return list;
    }
}

到这里,就改造完了,下面需要测试一下,验证我们的改造结果。首先把注册中心 springcloud-eureka 启动起来,接着再启动服务提供者 springcloud-service-provider ,最后再启动 springcloud-service-consumer。

都启动之后,在浏览器中访问 http://localhost:8000/ ,可以看到两个服务都注册到注册中心了。

在这里插入图片描述

接着,我们在浏览器新的标签页访问 http://localhost:8002/consumer/person/list-by-openfeign ,可以看到,有结果返回,同时日志也正常打印出来,这说明整合 OpenFeign 是没问题的。

在这里插入图片描述
在这里插入图片描述
通过这种方式调用服务提供者的接口,我们不再需要配置服务提供者的域名或者 IP ,只需要指定它在注册中心的服务名称便可,这样就实现了前面提到的微服务间的调用与注册中心关联上的目的。

入门篇暂时到这里结束,后面还有服务的熔断及降级、增加网关、增加配置中心等等,留待后面的博客再介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/597136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CS5466应用电路图|CS5466设计方案原理图|TypeC转HDMI8K30HZ(4K144HZ)芯片方案原理图

CS5466支持dsc1.1/12a压缩视频传输&#xff0c;是一款Type-C转HDMI8K30HZ或者4K144HZ方案芯片&#xff0c;其设计原理图如下&#xff1a; CS5466 Type-C/DP1.4转HDMI2.1的显示协议转换芯片, 内部集成了PD3.0及DSC decoder&#xff0c;可支持DP 2Lane最高8K30或4K144, 并能按客户…

拉取maven项目 pom出现 The <project> element is the root of the descriptor.

引入将各个module 修改JDK版本为1.8&#xff0c;然后再修改 Perferences -> Build -》Compiler -> Java Compiler各个版本&#xff0c;对各个项目改为1.8

Docker容器学习笔记

一、初始Docker 实质上&#xff1a;是将开发的代码和运行环境打包成一个容器。解决开发&#xff08;开发环境&#xff09;、测试&#xff08;测试环境&#xff09;、运维&#xff08;生产环境&#xff09;之间的沟通交流。 1.1Docker的概念 docker&#xff1a;解决跨环境迁移…

B. 广告投放

B. 广告投放 Problem - B - Codeforces 思路&#xff1a;对于这个题来说&#xff0c;我们很容易可以想到是一个dp问题&#xff0c;我们可以使用f[i][j]表示我们已经处理了前i-1个问题&#xff0c;并且当前剩余的人数是j的情况下&#xff0c;能够得到的最大的收益&#xff0c;那…

共享内存(内存映射的使用、注意事项、进程间通信、systemV共享内存)

一、内存映射 概念&#xff1a;使一个磁盘文件与内存中的一个缓冲区相映射&#xff0c;进程可以像访问普通内存一样对文件进行访问&#xff0c;不必再调用read,write。 mmap()的优点&#xff1a; 实现了用户空间和内核空间的高效交互方式 二、函数定义 void *mmap(void *ad…

PMP课堂模拟题目及解析(第17期)

161. 项目发起人任命一位高级工程师到指导委员会&#xff0c;来帮助监督项目管理计划。该工程师经常不同意由项目团队制定的计划&#xff0c;并在提交批准之前对项目管理计划表达严重关切。项目经理应该怎么做&#xff1f; A. 通知项目发起人&#xff0c;该工程师延迟了规划过程…

2、Kingbase - 修改密码报错

情况 Kingbase数据库修改密码后&#xff0c;重新连接失败 提示信息 致命错误: 用户 "system" Password 认证失败 (kbjdbc: autodetected server-encoding to be GB2312, if the message is not readable, please check database logs and/or host, port, dbname, u…

软件外包开发项目管理工具

随着软件项目的规模越做越大&#xff0c;项目管理人员需要使用工具管理项目进度&#xff0c;从而更有成效的管理好软件开发进度。软件开发的进度管理工具有很多&#xff0c;今天和大家分享一些常用的系统工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xf…

phpStudy2018 mysql启动失败问题

phpStudy2018 mysql启动失败问题 1.winR运行窗口输入services.msc&#xff0c;检查服务里面有MySQLa没有。 有&#xff0c;就打开服务 没有&#xff0c;就打开phpstudy面板&#xff0c;点击其他选项菜单——>服务管理器——>MySQL——>安装服务&#xff1b;然后刷新…

C++ 继承 文字+图片+代码 超详细解刨

什么是继承&#xff1f; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。 继承呈现了面向对象程序设计的层次结构&am…

二十分钟入门计算机视觉开源神器——课堂笔记

1&#xff0c;统一的深度学习框架&#xff0c;2.0 2&#xff0c;现状 3&#xff0c;代表算法库 &#xff08;1&#xff09;目标检测MMDetection 任务支持&#xff1a;目标家呢&#xff0c;实力分割&#xff0c;全景分割 覆盖广泛 算法丰富 使用方便 &#xff08;2&#xff0…

2023年Q1美团财报解读:拨开云雾 始见月明

原文出处&#xff1a;走马财经 5月底&#xff0c;随着京东、阿里巴巴、腾讯、快手、拼多多、美团等相继发布财报&#xff0c;中国互联网主流大公司的财报发布季结束。 一方面他们体量够大&#xff0c;另一方面他们要么深耕零售&#xff0c;要么与零售、消费息息相关&#xff…

复原IP地址-回溯

1题目 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&#xff0c;但是 "0.01…

17-Vue3中其它的 Composition API

目录 1、shallowReactive 与 shallowRef2、readonly 与 shallowReadonly3、toRaw 与 markRaw4、customRef5、provide 与 inject6、响应式数据的判断7、Composition API 的优势7.1 Options API 存在的问题7.2 Composition API 的优势 1、shallowReactive 与 shallowRef shallowR…

华为OD机试真题 Java 实现【快速开租建站】【2023Q1 200分】,附详细解题思路

一、题目描述 当前IT部门支撑了子公司颗粒化业务&#xff0c;该部门需要实现为子公司快速开租建站的能力&#xff0c;建站是指在一个全新的环境部署一套IT服务。 每个站点开站会由一系列部署任务项构成&#xff0c;每个任务项部署完成时间都是固定和相等的&#xff0c;设为1。…

细看SLMi823x系列SLMi8233BD双通道隔离驱动在 OBC 上的典型应用

数明深力科SLMi823x系列SLMi8233BD隔离驱动技术优势&#xff1a;具有高性能、高性价比、高可靠性的产品特性&#xff0c;应用覆盖UPS、充电桩、服务器电源、通信电源、新能源汽车动力总成系统的车载 OBC 领域。通过CQC认证的。 车载充电器&#xff08;OBC&#xff09;是电动汽…

如何研究带有不可微项的目标函数的局部极小值?

以optimtool的算法为例来解释 在Python >3.7的编程环境下&#xff0c;按如下方式下载optimtool&#xff0c;一个基于符号微分与数值近似的优化方法库&#xff1a; pip install optimtool --upgrade pip install optimtool>2.4.2目前没有为目标函数中不可微项增加预处理…

golang http请求封装

http请求封装在项目中非常普遍&#xff0c;下面笔者封装了http post请求传json、form 和get请求&#xff0c;以备将来使用 1、POST请求 1.1、POST请求发送 json 这里发送json笔者使用了2种方式&#xff0c;一种是golang 自带的 http.Post方法&#xff0c;另一是 http.NewReq…

iphone苹果手机如何备份整个手机数据?

手机上的数据变得越来越重要&#xff0c;大家也越来越注重数据安全。如果手机设备丢失的话&#xff0c;不仅是设备的丢失&#xff0c;还是数据的丢失。因此&#xff0c;备份数据就显得很重要。那么&#xff0c;iphone如何备份整个手机&#xff0c;苹果怎么查备份的照片&#xf…

14.3:给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中字典序最小的结果

给定一个由字符串组成的数组strs&#xff0c;必须把所有的字符串拼接起来&#xff0c;返回所有可能的拼接结果中字典序最小的结果 贪心写法 首先注意的一点是&#xff1a;如果两个字符串的长度相同&#xff0c;“abc”&#xff0c;“abd”&#xff0c;肯定是“abc”的字典序最…