SpringBoot+Nacos+OpenFeign实现服务的注册、发现、远程调用

发布时间 2023-09-04 16:43:15作者: 飘杨......

一、概述

  微服务的开发必定会用到SpringBoot、Nacos(服务发现、注册、配置中心)、OpenFeign(服务远程调用,也就是通过注解调用其他服务的接口)。今天写这篇是想把这三个功能集成在一起。

  让他们一起参与微服务的开发工作。

  要实现的目标:nacos要能够注册及发现服务,openfeign要能够调用远程服务的接口并返回数据。

  步骤:

    1.安装nacos,打开nacos服务,并登录nacos管理后台(账号密码都是:nacos)

    2.创建一个消费者SpringBoot工程,用于注册与发现服务,并进行远程服务调用

    3.创建一个生产者SpringBoot工程,用于注册服务,其提供的服务供消费者工程调用

二、实现步骤

  1.安装nacos(windows版),安装过程比较简单,参考博客

    安装好之后找到bin目录双击打开startup.cmd

   打开后的画面

  2.创建一个SpringBoot生产者工程

    a.配置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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yw.admin.server</groupId>
    <artifactId>SpringBootAdminServer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBootAdminServer</name>
    <description>SpringBootAdminServer</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.67_noneautotype2</version>
        </dependency>

        <!-- 注册中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.9.RELEASE</version>
        </dependency>
        <!-- 配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.9.RELEASE</version>
        </dependency>
        <!--        服务间远程调用-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.9.RELEASE</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

  b.配置resources/application.yml和bootstrap.yml

server:
  port: 8001

spring:
  application:
    name: tony-provider

  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #nacos的ip和端口
        group: tony-group #服务分组,这个需要注意下,消费者和生产者的group要一致
spring:
  application:
    name: tony-provider
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 #nacos的端口

  c.配置工程入口

@EnableFeignClients //启用远程服务调用注解
@SpringBootApplication //SpringBoot工程入口注解
@EnableDiscoveryClient //启用服务发现注解
public class MainProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainProviderApplication.class, args);
    }
}

  d.写一个UserController用于供消费者工程远程调用

@RestController
@RequestMapping("/user")
public class UserController {
    @GetMapping
    public UserBean getUser() {
        return new UserBean("德玛西亚", 32, "");
    }
}

  好了,到这里生产者工程,也就是提供服务的工程已经算是好了。下面贴一下消费者工程的代码。

  

 3.消费者工程

  1.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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.yw.admin.server</groupId>
    <artifactId>SpringBootAdminServer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBootAdminServer</name>
    <description>SpringBootAdminServer</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.67_noneautotype2</version>
        </dependency>

        <!-- 注册中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.9.RELEASE</version>
        </dependency>
        <!-- 配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.9.RELEASE</version>
        </dependency>
        <!--        服务间远程调用-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.2.9.RELEASE</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

  b.resources/application.xml和bootstrap.xml

server:
  port: 8002

spring:
  application:
    name: tony-consumer

  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 #这里是nacos也就是注册中心的ip和端口。代表我这个工程要向注册中心注册
        group: tony-group
spring:
  application:
    name: tony-consumer
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 #这里是nacos也就是注册中心的ip和端口。代表我这个工程要向注册中心注册

  c.工程入口添加注解

@EnableFeignClients//开启远程过程调用
@SpringBootApplication
@EnableDiscoveryClient//开启服务注册与发现
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

  d.写一个DiscoverController用于浏览器或者postman测试使用

@Slf4j
@RestController
@RequestMapping
public class DiscoverController {
  //此处就是基于Feign的注解,其就是一个接口,之后贴代码。宝子们只需要知道用这个接口就可以调用远程服务就行了
    @Autowired
    UserFeignClient userFeignClient;


    @GetMapping("/getUser")//这是本地服务调用,不要和远程的弄混淆了
    public UserBean getUser(){
        return userFeignClient.getUser();//执行远程服务调用
    }
}

  e.看看具体的远程Feign接口是怎么写的

@FeignClient("tony-provider")//这里加上远程服务调用的注解,其中“tony-provider”你你要调用远程服务的名字。
public interface UserFeignClient {

    @GetMapping("/user")//远程服务的路径,这里就要和生产者工程中的UserController中的getUser相对应了
    public UserBean getUser();
}

  测试的时候测试消费者工程。路径为:http://localhost:8002/getUser然后就可以拿到内容提供者工程返回的一个值,如下:

  我把服务注册后nacos中的服务列表也贴出来把。

 

  好了,到这里正式结束。