SpringCloud项目过程简单总结
项目结构
-
先new一个新的Maven工程,名字随便这里就叫finally_exam
-
然后在finally_exam这个项目下右键new一个个Module,选这个
-
Artifact是一个个启动类的名字,自己看着写
-
先来一个注册中心,选这一个依赖就可以,版本最好选2.3的,高的一些东西落后。。。
-
注册中心(@EnableEurekaServer )
-
区分注册中心和其他服务就是这个注解
-
看看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.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo_center</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo_center</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
</project>
-
配置属性文件application.properties我喜欢新建同名application.yml (有层次)作用一样
server:
port: 20000 //注册中心端口号自己看着写
eureka:
instance:
hostname: localhost
client:
#不注册,和不遍历,表名此模块是注册中心
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
-
启动类
package com.example.demo_center;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //注册中心的注解
public class DemoCenterApplication {
public static void main(String[] args) {
SpringApplication.run(DemoCenterApplication.class, args);
}
}
刚开始应该什么都没有,这有五个是我已经往里面注册了服务,到这注册中心就好了
其他自服务(@EnableEurekaClient)
公用模块
-
为了方便把实体类放入,可以让其他服务用
-
创建和注册中心一样
-
只是依赖选的不同
-
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.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo_common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo_common</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
yml文件
eureka:
client:
serviceUrl:
defaultZone: http://localhost:20000/eureka/ //注册中心端口号
server:
port: 20001 //公共模块的端口号自己看着来
spring:
application:
name: eureka-common //这个公共模块的服务在注册中心的名字
//想上图注册中心那五个
新建实体类
一个用户的
一个响应数据的
自己看着来就好
package com.example.demo_common.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.stereotype.Component;
import java.io.Serializable;
import java.util.Date;
/**
* @ClassName: User
* @Description: TODO
* @Author: bean
* @Date: 2021/6/9 8:44
* @Version: 1.0
* @Return:
*/
@Data
@ToString
@Component
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private Integer id;
private String uid;
private String pwd;
private Date regDate;
}
package com.example.demo_common.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.omg.CORBA.OBJ_ADAPTER;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
/**
* @ClassName: MyResponseData
* @Description: TODO
* @Author: bean
* @Date: 2021/6/9 8:49
* @Version: 1.0
* @Return:
*/
@Data
@ToString
@Component
@NoArgsConstructor
@AllArgsConstructor
public class MyResponseData {
private Integer errorCode;
private String msg;
private String status;
private Object object;
private List<Object> list;
private Map<String,Object> map;
}
启动类
package com.example.demo_common;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient // 子服务
public class DemoCommonApplication {
public static void main(String[] args) {
SpringApplication.run(DemoCommonApplication.class, args);
}
}
提供者模块
创建同上
pow.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.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo_user_provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo_user_provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引用公用模块-->
<dependency>
<groupId>com.example</groupId>
<artifactId>demo_common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Mysql-connector-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<!-- mybatis的依赖 -->
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!-- druid连接器,帮助管理数据库连接-->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.6</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
yml文件(自己看看需要改什么)
#SpringCloud配置
eureka:
client:
serviceUrl:
defaultZone: http://localhost:20000/eureka/
server:
port: 20002
spring:
application:
name: user-provider
#MyBatis和Druid配置
#设置数据源(通过Druid设置)
datasource:
druid:
db-type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/springcloudexam?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
initial-size: 3
min-idle: 2
max-active: 10
#MyBatis相关配置
#开启mybatis的调试功能,可以在控制台打印数据的执行情况,替换SSM项目的log4j
logging:
level:
com.iss.demo.dao: debug
mybatis:
configuration:
lazy-loading-enabled: on
cache-enabled: on
#mapper-locations: 配置xml文件形式时,xml文件的位置
type-handlers-package: com.iss.demo.entity
dao
package com.example.demo_user_provider.dao;
import com.example.demo_common.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
/**
* @ClassName: UserDao
* @Description: TODO
* @Author: bean
* @Date: 2021/6/9 9:04
* @Version: 1.0
* @Return:
*/
@Repository
@Mapper
public interface UserDao {
@Select("select * from user where uid=#{uid} and pwd=#{pwd}")
public User login(User user);
}
service
package com.example.demo_user_provider.service;
import com.example.demo_common.entity.User;
import com.example.demo_user_provider.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
/**
* @ClassName: UserService
* @Description: TODO
* @Author: bean
* @Date: 2021/6/9 9:06
* @Version: 1.0
* @Return:
*/
@Service
public class UserService {
@Autowired
private UserDao dao;
public User login(User user){
user.setPwd(DigestUtils.md5DigestAsHex(user.getPwd().getBytes()));//加密
return dao.login(user);
}
}
controller
package com.example.demo_user_provider.controller;
import com.example.demo_common.entity.User;
import com.example.demo_common.model.MyResponseData;
import com.example.demo_user_provider.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName: UserController
* @Description: TODO
* @Author: bean
* @Date: 2021/6/9 9:07
* @Version: 1.0
* @Return:
*/
@RestController
public class UserController {
@Autowired
private UserService service;
//一定要分成两个参数传递过来,一定要加RequestParam注解
@RequestMapping("login")
public MyResponseData login(@RequestParam("uid") String uid, @RequestParam("pwd") String pwd){
User user = new User();
user.setUid(uid);
user.setPwd(pwd);
user = service.login(user);
MyResponseData data = new MyResponseData();
if(user == null){
data.setErrorCode(-1);
data.setMsg("用户或密码错误");
data.setStatus("error");
}else {
data.setErrorCode(0);
data.setMsg("登录成功");
data.setStatus("success");
data.setObject(user);
}
return data;
}
@RequestMapping("login1")
public MyResponseData login1(@RequestBody User user){
System.out.println("user="+user);
user = service.login(user);
MyResponseData data = new MyResponseData();
if(user == null){
data.setErrorCode(-1);
data.setMsg("用户或密码错误");
data.setStatus("error");
}else {
data.setErrorCode(0);
data.setMsg("登录成功");
data.setStatus("success");
data.setObject(user);
}
return data;
}
}
消费者模块
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.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo_user_consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo_user_consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>demo_common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</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>
</project>
注意
为了用公用模块的东西,在公用模块里面配置里面找到公用模块的这个
<groupId>com.example</groupId>
<artifactId>demo_common</artifactId>
<version>0.0.1-SNAPSHOT</version>
加到其他用到它的模块中,
上面代码都加过只是提醒一下自己
<dependency>
<groupId>com.example</groupId>
<artifactId>demo_common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
yml
eureka:
client:
serviceUrl:
defaultZone: http://localhost:20000/eureka/
server:
port: 20003
spring:
application:
name: user-consumer
#设置视图解析器
mvc:
view:
prefix: /pages/ //这个多余了,老师直接用的以前的,是把页面放在了pages文件夹中
suffix: .html // prefix: / 可能这样就好了,没有试,不影响运行
# 需要开始feign的熔断
feign:
hystrix:
enabled: true
主页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="login" method="post">
用户名:<input name="uid" type="text"><br>
密码:<input name="pwd" type="password"><br>
<input type="submit" value="Login">
</form>
</body>
</html>
service
-
package com.example.demo_user_consumer.service;
import com.example.demo_common.entity.User;
import com.example.demo_common.model.MyResponseData;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* @ClassName: UserService
* @Description: TODO
* @Author: bean
* @Date: 2021/6/9 9:29
* @Version: 1.0
* @Return:
*/
@Service
@FeignClient(value = "user-provider", fallback = UserServiceFallBack.class)
public interface UserService1 {
// 传递非对象参数
@RequestMapping("login")
public MyResponseData login(@RequestParam String uid, @RequestParam String pwd);
// 传递对象
@RequestMapping("login1")
public MyResponseData login1(@RequestBody User user);
}
熔断之后
package com.example.demo_user_consumer.service;
import com.example.demo_common.entity.User;
import com.example.demo_common.model.MyResponseData;
import org.springframework.stereotype.Component;
/**
* @ClassName: UserServiceFallBack
* @Description: TODO
* @Author: bean
* @Date: 2021/6/9 9:31
* @Version: 1.0
* @Return:
*/
@Component
public class UserServiceFallBack implements UserService1 {
@Override
public MyResponseData login(String uid, String pwd) {
MyResponseData data = new MyResponseData();
data.setErrorCode(-100);
data.setMsg("服务提供已关闭");
data.setStatus("error");
return data;
}
public MyResponseData login1(User user) {
MyResponseData data = new MyResponseData();
data.setErrorCode(-100);
data.setMsg("服务提供已关闭");
data.setStatus("error");
return data;
}
}
controller
package com.example.demo_user_consumer.controller;
import com.example.demo_common.entity.User;
import com.example.demo_common.model.MyResponseData;
import com.example.demo_user_consumer.service.UserService1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName: UserController
* @Description: TODO
* @Author: bean
* @Date: 2021/6/9 9:29
* @Version: 1.0
* @Return:
*/
@RestController
public class UserController {
@Autowired
private UserService1 service;
@RequestMapping("login")
public MyResponseData login(String uid,String pwd){
return service.login(uid,pwd);
}
//传递对象
@RequestMapping("login1")
public MyResponseData login1(User user){
return service.login1(user);
}
}
启动类(@EnableFeignClients(basePackages = "com.example.demo_user_consumer.service"))
package com.example.demo_user_consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableEurekaClient
//加上basePackages,熔断所在的包
@EnableFeignClients(basePackages = "com.example.demo_user_consumer.service")
public class DemoUserConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DemoUserConsumerApplication.class, args);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?