当前位置:   article > 正文

SpringCloud搭建的第一个微服务项目_idea搭建springcloud微服务项目

idea搭建springcloud微服务项目

前言

此为springcloud搭建微服务的第一个案例,相关技术受到bilibili上黑马程序员视频教程的指导

一、 工具准备

查看《如何创建一个Spring boot项目》,需要准备的开发环境和springboot一致。

二、 系统设计逻辑

 

三、利用SpringCloud实现微服务的创建

3.1 父工程

创建父工程,只需要在intellij idea中创建一个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>

    <groupId>xwch</groupId>
    <artifactId>spring-cloud-demo</artifactId>
    <version>0.1.0</version>
    <packaging>pom</packaging>

    <modules>
        <module>say-hello</module>
        <module>user</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <java.version>18</java.version>
        <spring-cloud.version>2021.0.3</spring-cloud.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

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

</project>

然后分别在工程项目中创建如下目录 :

 

3.2 生产者工程

1. 创建springboot工程

利用https://github.com/spring-io/initializr,创建生产者:spring-cloud-say的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>xwch</groupId>
        <artifactId>spring-cloud-demo</artifactId>
        <version>0.1.0</version>
    </parent>

    <groupId>xwch</groupId>
    <artifactId>spring-cloud-say-hello</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-cloud-say-hello</name>
    <description>Demo project for Spring Boot</description>

    <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>
    </dependencies>

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

</project>

备注:其中表红色的代码为通过spring-io/initializr创建后,在Intellij idea中添加进去的,表示此服务为spring-cloud-demo的微服务。

2. 添加@RestController方法

在本springboot启动类中,添加RestController方法,具体代码如下:


/**
 * 作者:肖万程
 * @时间 2022-12-18
 * 编写一个微服务案例,本类为微服务项目的生产者服务,被消费者调用。本服务的调用调口地址为:ip:8090/greeting
 */

@RestController
@SpringBootApplication
public class SayHelloApplication {

    /**
     * 全局日志对象
     */
    private static Logger log = LoggerFactory.getLogger(SayHelloApplication.class);

    public static void main(String[] args){
        SpringApplication.run(SayHelloApplication.class,args);
    }

    /**
     * 访问URL:ip:端口号/greeting
     * @return 向消费者随机返回<String>List<String></String>对象中的一个字符串
     */
    @GetMapping("/greeting")
    public String greet() {
        log.info("Access to SayHelloApplication /greeting");

        List<String> greetings = Arrays.asList("Hi there", "Greetings", "Success");
        Random rand = new Random();

        int randomNum = rand.nextInt(greetings.size());
        return greetings.get(randomNum);
    }
}

3. 添加yml配置文件

添加yml配置文件,在其中定义port:

 

3.2 消费者工程

1. 创建springboot工程

利用https://github.com/spring-io/initializr,创建生产者:spring-cloud-user的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>xwch</groupId>
        <artifactId>spring-cloud-demo</artifactId>
        <version>0.1.0</version>
    </parent>

    <groupId>xwch</groupId>
    <artifactId>spring-cloud-user</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-cloud-user</name>
    <description>Demo project for Spring Boot</description>

    <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.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

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

</project>

备注:

  • 其中表红色的代码为通过spring-io/initializr创建后,在Intellij idea中添加进去的,
  • <parent>表示此服务为spring-cloud-demo的微服务。
  • <artifactId>spring-boot-configuration-processor</artifactId>为javabean引用yml的值的加载类
  • <artifactId>lombok</artifactId>为使用@Data、@AllArgsConstructor、@NoArgsConstructor注释的加载类。

2. 创建Javabean,引用YML配置文件的值

创建javabean,获得生产者的服务ip地址与端口号

package HiUser.POJO;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "say-hello-url")
public class SayHelloURL {
    private String host;
    private String port;
}

3. 添加@RestController方法

在Application启动了类中添加RestController,具体代码如下:

package HiUser;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import HiUser.POJO.SayHelloURL;


/**
 * @author xwch
 * @时间: 2022-12-18
 * 写一个微服务案例,本类为微服务项目的消费者,向URL:ip:端口号/greeting 发起请求,展示返回结果
 */

@RestController
@SpringBootApplication
public class UserApplication {
    /**
     * 全局日志对象
     */
    private static Logger log = LoggerFactory.getLogger(UserApplication.class);

    public static void main(String[] args) {
        ConfigurableApplicationContext context=SpringApplication.run(UserApplication.class, args);
    }

    /**
     * Created an instance of RestTemplate object and injected into the container of spring
     *
     * @return an instance of RestTemplate
     */

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

    //get the ipaddress and port of SayHelloApplication microservice.

    @Autowired
    private SayHelloURL sayHelloURL;
    /**
     * 使用RestTemplate向生产者发起请求,生产者URL地址从全局YML文件中获取
     *
     * @return 展示从生产者获取的结果
     */
    @GetMapping("/hi")
    public String hi() {
        log.info("Access to UserApplication /hi");
        String url = sayHelloURL.getHost()+":"+sayHelloURL.getPort()+"/greeting";
        log.info("Access to "+url);
        return "hi,"+this.restTemplate().getForObject(url,String.class);
    }

}

备注:

  • 在本示例中,使用RestTemplate对象向生产者发起服务请求
  • @Autowired为自动加载被标注为@Component的javabean,从yml文件中获取生产者的ip地址和端口号

4. 添加yml配置文件

 

四、 运行结果

4.1 启动生产者

 

4.2 启动消费者

 

4.3 调用结果

在Terminal通过curl调用消费者的访问入口:http://localhost:8888/hi,返回如下结果:

 

消费者Terminal显示的结果:

 

生产者Terminal显示的结果:

 

五、补充说明

在demo开发过程中犯了几个错误,导致浪费了很多时间:

  • yml配置文件中一级目录使用了大写字母,导致javabean加载失败
  • javabean没有添加无参数构造器和全参数构造器,导致javabean加载失败

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/57707
推荐阅读
相关标签
  

闽ICP备14008679号