赞
踩
前言
此为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>
备注:
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);
}
}
备注:
4. 添加yml配置文件
四、 运行结果
4.1 启动生产者
4.2 启动消费者
4.3 调用结果
在Terminal通过curl调用消费者的访问入口:http://localhost:8888/hi,返回如下结果:
消费者Terminal显示的结果:
生产者Terminal显示的结果:
五、补充说明
在demo开发过程中犯了几个错误,导致浪费了很多时间:
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。