SpringCloud项目过程简单总结

天红

项目结构

结构

  1. 先new一个新的Maven工程,名字随便这里就叫finally_exam

  2. 然后在finally_exam这个项目下右键new一个个Module,选这个26vYVI.md.png

  3. Artifact是一个个启动类的名字,自己看着写26x76g.md.png

  4. 先来一个注册中心,选这一个依赖就可以,版本最好选2.3的,高的一些东西落后。。。26xeyQ.md.png

  5. 模块的名字自己看着写然后🆗26zp1U.md.png

注册中心(@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);
        }
     
     }
     

    然后输入如图输入运行注册中心2gdpUU.md.png

刚开始应该什么都没有,这有五个是我已经往里面注册了服务,到这注册中心就好了

其他自服务(@EnableEurekaClient)

公用模块

  1. 为了方便把实体类放入,可以让其他服务用

  2. 创建和注册中心一样

  3. 只是依赖选的不同

  4. 2gwQoT.md.png

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 //这个公共模块的服务在注册中心的名字
    //想上图注册中心那五个

 

项目结构2gB1xJ.png

新建实体类

一个用户的

一个响应数据的

自己看着来就好

 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);
    }
 
 }

提供者模块

创建同上

2gc1xO.png

 

 

 

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;
    }
 }

 

 

 

 

 

消费者模块

2gR2od.md.png

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

2g6OxS.png

主页
 <!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

  1.  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);
    }
 
 }
posted @ 2021-06-10 11:40  你我不在年少  阅读(364)  评论(0编辑  收藏  举报