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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM