Spring Cloud 项目搭建
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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ityemu</groupId>
<artifactId>FinancialManage</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>financial-eureka</module>
<module>financial-product</module>
<module>financial-consumer</module>
</modules>
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.4.1</spring-boot.version>
<spring-web.version>5.3.2</spring-web.version>
<jackson.version>2.11.3</jackson.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring-web.version}</version>
</dependency>
<!--引用jackson包,json解析-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<!--lombok 注解-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!-- 指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<!-- 源代码使用的JDK版本 -->
<source>1.8</source>
<!-- 需要生成的目标class文件的编译版本 -->
<target>1.8</target>
<!-- 字符集编码 -->
<encoding>UTF-8</encoding>
<!-- 跳过测试 -->
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
一.创建SpringCloud-EUREKA 注册中心项目
1.删除 src
2.选择File 》》》new 》》Modual 》》 》spring Initializr 点击Next
3.输入模块名称
4.选择Spring Cloud Discovery 》》》选择 EUreka Server
5.编写application-eureka.yml 信息
server:
port: 5000
eureka:
instance:
hostname: localhost
client:
service-url:
defaultZone: http://localhost:5000/eureka/
# 声明是否将自己的信息注册到 Eureka 服务器上
register-with-eureka: false
# 是否到 Eureka 服务器中抓取注册信息
fetch-registry: false
server:
#设为false,关闭自我保护,即Eureka server在云心光器件会去统计心跳失败比例在15分钟之内是否低于85%,如果低于85%,EurekaServer
#会将这些事例保护起来,让这些事例不会过期,但是在保护器内如果刚哈这个服务提供者非正常下线了,此时服务消费者会拿到一个无效的服务
#实例,此时调用会失败,对于这个问题需要服务消费者端有一些容错机制,如重试、断路器等;
enable-self-preservation: false
#扫描失效服务的间隔时间(单位是毫秒,摩恩是60*1000),即60s
eviction-interval-timer-in-ms: 2000
spring:
application:
name: eureka-server
profile: eureka
6.编写 eureka 模块下的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.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ityemu</groupId>
<artifactId>financial-eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka</name>
<description>springCloud 注册中心</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.0-RC1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<resources>
<resource>
<!--指定resource插件处理哪个目录下的资源文件-->
<directory>src/main/resources</directory>
<!--打卡资源过滤功能-->
<filtering>true</filtering>
</resource>
</resources>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
</project>
7.编写application启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
8.启动eureka 模块
二.创建SpringCloud-Product生产者模块
1.选择File 》》》new 》》Modual 》》 》spring Initializr 点击Next
2.输入模块名称
3.选择Spring Cloud Discovery 》》》选择 Eureka Discovery Client
4.编写application-product.yml 信息
spring:
profile: product
application:
name: product-server
cloud:
config:
discovery:
enabled: true
serviceId: eureka-server
server:
port: 7002
#servlet:
# context-path: /product
eureka:
client:
service-url:
#defaultZone 这个是不会提示的,此处需要自己写
#实际上属性应该是service-url,这个属性是个map(key-value)格式;当key是defaultZone的时候才能被解析;所以这里没有提示,
#但是自己还需要写一个defaultZone;
defaultZone: http://localhost:5000/eureka/
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册消息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
instance:
prefer-ip-address: true
5.编写 product 模块下的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>
<artifactId>FinancialManage</artifactId>
<groupId>com.ityemu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.ityemu</groupId>
<artifactId>financial-product</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>financial-product</name>
<description>springCloud生产者</description>
<properties>
<spring-cloud.version>2020.0.0-RC1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
6.编写application 启动类
@SpringBootApplication
//@EnableEurekaClient 和 @EnableDiscoveryClient 都是让eureka发现该服务并注册到eureka上的注解
//相同点:都能让注册中心Eureka发现,并将该服务注册到注册中心上;
//不同点:@EnableEurekaClient只适用于Eureka作为注册中心,而@EnableDiscoveryClient可以是其他注册中心;
@EnableEurekaClient
@EnableDiscoveryClient
public class FinancialProductApplication {
public static void main(String[] args) {
SpringApplication.run(FinancialProductApplication.class, args);
}
}
7.编写提供服务端口信息
@RestController
@RequestMapping("product")
public class ProductController {
@Value("${server.port}")
String port;
@RequestMapping("/hi")
public String home(@RequestParam(value = "name", defaultValue = "forezp") String name) {
return "hi " + name + " ,i am from port:" + port;
}
@RequestMapping("/time")
public String getTime(){
return new Date().toString();
}
}
8.启动product 模块
三.创建SpringCloud-Product生产者模块
前3步同创建生产者模块一样
4.编写application-consumer.yml 信息
server:
#servlet:
# 定义项目的访问访问路径
# context-path: /consumer
#定义端口号
port: 7001
spring:
profile: consumer
application:
#定义应用名称,即服务名称
name: consumer-server
eureka:
client:
service-url:
defaultZone: http://localhost:5000/eureka/
#设置feign客户端超时时间(OpenFeign默认支持ribbon)
ribbon:
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的实际
ReadTimeout: 5000
#指的是建立连接后从服务器读取到可用资源所用的时间
ConnectTimeout: 5000
5.编写 consumer 模块下的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>
<artifactId>FinancialManage</artifactId>
<groupId>com.ityemu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.ityemu</groupId>
<artifactId>financial-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>financial-consumer</name>
<description>springCloud 消费者</description>
<properties>
<spring-cloud.version>2020.0.0-RC1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<exclusions>
<exclusion>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
</project>
6.编写application 启动类
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
public class FinancialConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(FinancialConsumerApplication.class, args);
}
@LoadBalanced //使用负载均衡机制
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
7.消费端口接口类编写
@Service
@FeignClient("PRODUCT-SERVER") // 指定当前Service所绑定的微服务名称在
@RequestMapping("product")//指定当前Restful 链接
public interface ConsumerService {
@GetMapping("/hi")
public String getResultByName(@PathVariable("name") String name);
@GetMapping("/time")
public String getTime();
}
8.编写提供消费端口信息
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private ConsumerService consumerService;
@GetMapping("/show")
public String showMessage(@RequestParam String name){
String result = restTemplate.getForObject("http://product-server/hi?name=" + name, String.class);
System.out.println(result);
return result;
}
@GetMapping("/get")
public String getMessage(@RequestParam String name){
String result = consumerService.getResultByName(name);
System.out.println(result);
return result;
}
@GetMapping(value = "/time")
public String paymentFeignTimeout() {
return consumerService.getTime();
}
}
9.启动consumer模块