SpringCloud知识点分析之项目实战1

一、项目前瞻

1、项目步骤构建

       一个springCloud微服务项目基本由以下三部分组成:

       ①整体父工程

          新建父工程project:microserviceccloud,切记是Packing是pom模式

          主要是定义pom文件,将后续各个子模块公用的jar包等统一提出来,类似于一个抽象的父类。

       ②公共子模块

           在父工程下新建公共子工程Module:microservicecloud-api

           修改pom.xml

           新建entity并配合lombok使用

           maven clean install之后给其他模块引用,达到通用的目的,即需要用到部门实体类的话,不用每个工程

           定义,只需要引用该模块即可。

       ③部门微服务提供者

           新建微服务提供者工程Module:microservicecloud-provider-dept-8001

           pom.xml

           application.yml

           mybatis.cfg.xml

           mysql创建部门数据库脚本

           创建映射类DeptDao

           创建对应的映射文件

           创建业务逻辑层

           创建控制层

           创建启动类

           测试

       ④部门微服务消费者

           新建微服务消费者工程Module:microservicecloud-consumer-dept-80

           pom.xml

           application.yml

           新建cfgbeans包下ConfigBean的编写(类似spring里面的applicationContext.xml中写的注入bean)

           新建controller包下的DeptController_consumer部门微服务消费者REST

       ⑤总结

          微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每个微服务提供

          单个业务功能的服务,一个服务做一件事情,从技术角度来看就是一种小二独立的处理过程,类似进程概念,

          能够自行单独行动或者销毁,拥有自己独立的数据库。

      ⑥将其他组件加到项目当中

          见SpringCloud知识点分析之项目实战2:https://blog.csdn.net/weixin_41690908/article/details/86427013

二、项目创建

1.项目准备工作

由于是有多个子项目构成,为了便于管理,可以在working set中新建这些项目。

  1.设置成working set状态

  

   Top Level Elements >working Sets

2.新建Working sets

   鼠标右键 new >Java Working sets

  

2.父工程

    1.使用maven构建项目,并且packing选择pom,意思是管理子工程的pom

    

2.pom.xml

<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.atguigu.spring</groupId>
  <artifactId>microservicecloud</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  
  
    <properties>
          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          <maven.compiler.source>1.8</maven.compiler.source>
          <maven.compiler.target>1.8</maven.compiler.target>
          <junit.version>4.12</junit.version>
          <log4j.version>1.2.17</log4j.version>
         <lombok.version>1.16.18</lombok.version>
     </properties>
     <!--dependencyManagement:父类工程管理机制  -->
     <dependencyManagement>
         <dependencies>
          
          <!--spring cloud-->
            <dependency>
                 <groupId>org.springframework.cloud</groupId>
                 <artifactId>spring-cloud-dependencies</artifactId>
                 <version>Dalston.SR1</version>
                <type>pom</type>
                 <scope>import</scope>
              </dependency>
             
             <!--spring boot-->
             <dependency>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-dependencies</artifactId>
                 <version>1.5.9.RELEASE</version>
                <type>pom</type>
                 <scope>import</scope>
             </dependency>
             
             <!--mysql驱动-->
             <dependency>
                 <groupId>mysql</groupId>
                 <artifactId>mysql-connector-java</artifactId>
                  <version>5.0.4</version>
             </dependency>
             
             <!--德鲁伊-->
             <dependency>
                 <groupId>com.alibaba</groupId>
                  <artifactId>druid</artifactId>
                 <version>1.0.31</version>
            </dependency>
             
             <!--spring boot和mybatis整合-->
             <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                 <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.0</version>
             </dependency>
             
            <!--logback日志-->
            <dependency>
                 <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                 <version>1.2.3</version>
             </dependency>
             
             <!--测试-->
            <dependency>
                 <groupId>junit</groupId>
                 <artifactId>junit</artifactId>
                 <version>${junit.version}</version>
                  <scope>test</scope>
             </dependency>
             
             <!--log4日志-->
             <dependency>
                  <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                 <version>${log4j.version}</version>
            </dependency>
             
         </dependencies>
     </dependencyManagement>
     
     
     <build>
         <finalName>microservicecloud</finalName>
         <resources>
             <resource>
                 <directory>src/main/resources</directory>
                 <filtering>true</filtering>
             </resource>
         </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                 <configuration>
                    <delimiters>
                         <delimit>$</delimit>
                     </delimiters>
                </configuration>
            </plugin>
         </plugins>
     </build>
 
  
</project>

3.公共子工程

   1.选中父工程右键new>project>maven>Maven Module

     

      

   2.创建之后的变化

     

    父工程中的pom.xml

   

    该子公共工程中的pom.xml

   

 3.创建实体类Dept

    使用lombok的注解来来动态生成构造函数以及set、get方法

package com.atguigu.springcloud.entities;

import java.io.Serializable;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

/**
 * 微服务时必须要实现序列化接口
 *一下注解由组件lombok支持:构造函数和set、get方法都是动态生成,即使属性有增减,都不需要修改
 *@AllArgsConstructor   //表示加入全参构造函数
 *@NoArgsConstructor    //表示加入无参构造函数
 *@Data                 //动态生成set和get方法
 *@Accessors(chain=true)//对set和get进行链式风格访问
 */
@SuppressWarnings("serial")
//@AllArgsConstructor   //表示加入全参构造函数,如果不要可以注释掉
@NoArgsConstructor
@Data
@Accessors(chain=true)
public class Dept implements Serializable{   //Dept(Entity)  orm mysql ->Dept (table) 类表映射关系
	
	private Long deptno;       //主键
	private String dname;      //部门名称
	private String db_source;  //来自哪个数据库,因为微服务架构可以一个服务对应一个数据库,同一个信息被存储到不同数据库
	
	//如果想要自定义有参构造函数的参数个数,可以去掉全参构造函数
	public Dept(String dname) {
		super();
		this.dname = dname;
	}
        
        //测试以上注解
	public static void main(String[] args) {
		
		Dept dept = new Dept();
		//链式访问(该类必须要序列化才能使用这种方式)
		dept.setDeptno(11L).setDname("语文").setDb_source("DB201");
		//等同于
		dept.setDeptno(11L);
		dept.setDname("语文");
		dept.setDb_source("DB201");
	}
	
}

      在outline中会动态显示注解生成的内容

     

       关于引用lombok的一些问题:https://blog.csdn.net/c18772517102/article/details/81276673

  4.  使该工程在本地库重新生成jar包

       右键点击该工程 >run as>maven clean

       右键点击该工程 >run as>maven install

  5.如果其他子工程需要调用该公共工程的某些类的化,可以在其对应的pom中引用该公共工程的支持

<dependency>
<groupId>com.atguigu.spring</groupId>
     <artifactId>microservicecloud-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

4.   微服务提供者

         1.创建微服务提供者:microservicecloud-provider-dept-8001

            创建方法同公共子工程。

            创建之后父工程的pom.xml中会自动增加该模块的信息

           

         2.pom.xml

<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>
  <parent>
    <groupId>com.atguigu.springcloud</groupId>
    <artifactId>microservicecloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>microservicecloud-provider-dept-8001</artifactId>
  
    <dependencies>
         <!--引入自己定义的api通用包,可以使用Dept部门的entity --> 
            <dependency>
                 <groupId>com.atguigu.springcloud</groupId>
                 <artifactId>microservicecloud-api</artifactId>
                 <version>${project.version}</version>
              </dependency>
              
            <!--测试-->
            <dependency>
                 <groupId>junit</groupId>
                 <artifactId>junit</artifactId>
            </dependency>
            
             <!--mysql驱动-->
             <dependency>
                 <groupId>mysql</groupId>
                 <artifactId>mysql-connector-java</artifactId>
             </dependency>
             
             <!--德鲁伊 连接池-->
             <dependency>
                 <groupId>com.alibaba</groupId>
                  <artifactId>druid</artifactId>
            </dependency>
            
            <!--logback日志-->
            <dependency>
                 <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
             </dependency>
             
             <!--spring boot和mybatis整合-->
             <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                 <artifactId>mybatis-spring-boot-starter</artifactId>
             </dependency>
             
             <!--spring boot的内嵌的服务容器-->
             <dependency>
                <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-starter-jetty</artifactId>
             </dependency>
             
             <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>
             </dependency>
             <!-- 热部署 -->
               <dependency>
                <groupId>org.springframework</groupId>
                 <artifactId>springloaded</artifactId>
             </dependency>
             
                <dependency>
                <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-devtools</artifactId>
             </dependency>
    </dependencies>
  
  
</project>

      3.application.yml

         在src/main/source下新建该配置文件

server:
  port: 8001
  
mybatis:
  config-location: classpath:mybatis/mybatis.cfg.xml       #mybatis配置文件所在路径
  type-aliases-package: com.atguigu.springcloud.entities   #所有Entity别名类所在包
  mapper-locations:
  - classpath:mybatis/mapper/**/*.xml                      #mapper映射文件
  
spring:
   application:
    name: microservicecloud-dept
   datasource:  
    type: com.alibaba.druid.pool.DruidDataSource           #当前数据源操作类型
    driver-class-name: org.gjt.mm.mysql.Driver             #mysql驱动包
    url: jdbc:mysql://localhost:3306/springcloudDB01       #数据库名称
    username: root
    password: admin
    dbcp2:
      min-idle: 5                                          #数据库连接池的最小维持连接数
      initial-size: 5                                      #初始化连接数
      max-total: 5                                         #最大连接数
      max-wait-millis: 200                                 #等待连接获取的最大超时时间

      4.新建mybatis.cfg.xml

            src/main/resource下新建mybatis文件夹,并新建该配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
  <!-- mybatis已经被整合到Spring中去了,案例是不需要mybatis.cfg.xml文件 -->
  <configuration>
  
  <settings>
   
  <setting name="cacheEnabled" value="ture"  /><!-- 开启二级缓存 -->
  </settings>
  
  </configuration>

       5.新建数据库并建立对应的dept表

         

       6.创建映射类

package com.atguigu.springcloud.dao;

import java.util.List;

import org.apache.ibatis.annotations.Mapper;

import com.atguigu.springcloud.entities.Dept;


@Mapper
public interface DeptDao {
	
	public boolean addDept(Dept dept);
	
	public Dept findById(Long id);
	
	public List<Dept> findAll();
	
	

}

     7.创建映射文件

        在src/main/source下的mybatis文件夹下新建mapper文件夹并新建dept接口的落地实现类

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 根节点:对应接口 -->
<!-- 为mapper指定唯一的namespace,namespace的值习惯上设置成包名+sql映射文件名,可保证唯一性 -->
<!-- 这里namespace必须是UserMapper接口的路径,不然运行的时候要报错 “is not known to the MapperRegistry” -->
<!--ssm集合框架中,不支持使用别名 -->
<mapper namespace="com.atguigu.springcloud.dao.DeptDao">
        <insert id="addDept" parameterType="Dept">
          insert into dept(dname,db_source) values(#{dname},DATABASE())
        </insert>
        
        <select id="findById" parameterType="Long">
          select deptno,dname,db_source from  dept where deptno=#{id} 
        </select>
        
        <select id="findAll" resultType="Dept">
          select deptno,dname,db_source from dept
        </select>
    
</mapper>

5   8.新建业务逻辑层

        在com.atguigu.springcloud.service下新建Deptservice接口以及对应的实现类DeptServiceIpml

package com.atguigu.springcloud.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.atguigu.springcloud.dao.DeptDao;
import com.atguigu.springcloud.entities.Dept;
import com.atguigu.springcloud.service.DeptService;

@Service
public class DeptServiceImpl implements DeptService {

	@Autowired
	private DeptDao deptDao;
	@Override
	public boolean add(Dept dept) {
		return deptDao.addDept(dept);

	}

	@Override
	public Dept get(Long id) {
		// TODO Auto-generated method stub
		return deptDao.findById(id);
	}

	@Override
	public List<Dept> list() {
		// TODO Auto-generated method stub
		return deptDao.findAll();
	}

}

     9.新建控制层

        在com.atguigu.springcloud.controller下新建DeptController

package com.atguigu.springcloud.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.atguigu.springcloud.entities.Dept;
import com.atguigu.springcloud.service.DeptService;

@RestController
public class DeptController {
	
	@Autowired
	private DeptService deptService;
	
	@RequestMapping(value="/dept/add",method=RequestMethod.POST)
	public boolean  add(@RequestBody Dept dept) {

		return deptService.add(dept);
		
	}
	
	@RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
	public Dept get(@PathVariable("id")Long id) {
		
		return deptService.get(id);
	}
	
	@RequestMapping(value="/dept/list",method=RequestMethod.GET)
	public List<Dept> list() {
		
		return deptService.list();
	}

}

   10.新建启动类

        在com.atguigu.springcloud下DeptProvider8001_app

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DeptProvider8001_app {
	
	public static void main(String[] args) {
		SpringApplication.run(DeptProvider8001_app.class, args);
	}

}

    11.测试

         在地址栏中输入:localhost://8001/dept/list或者localhost://8001/dept/1

                 

 

5.微服务消费者

    1.创建Module工程,同上

    2.pom.xml

<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>
  <parent>
    <groupId>com.atguigu.springcloud</groupId>
    <artifactId>microservicecloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>microservicecloud-consumer-dept-80</artifactId>
  <description>部门微服务消费者</description>
  
  <dependencies>
          <!--引入自己定义的api通用包,可以使用Dept部门的entity --> 
          <dependency>
               <groupId>com.atguigu.springcloud</groupId>
               <artifactId>microservicecloud-api</artifactId>
               <version>${project.version}</version>
          </dependency>
          
          <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
          
          <!-- 热部署 -->
          <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>springloaded</artifactId>
          </dependency>
          <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-devtools</artifactId>
          </dependency>
  
  </dependencies>
</project>

   3. application.yml

server:
  port: 80

   4.新建ConfigBean

      在com.atguigu.springcloud下新建cfgBeans包,并新建ConfigBean类

package com.atguigu.springcloud.cfgBeans;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * 该类加上注解@Configuration之后等同于applicationContext.xml
 * 
 */

@Configuration
public class ConfigBean {
	//注解的形式定义bean
	@Bean
	public RestTemplate getRestTemplate() {
		//RestTemplate:提供多种便捷访问远程Http服务的方法
		//是一种简单便捷的访问restful服务模板类,是spring提供的用于访问Rest服务的客户端模板工具集
		return new RestTemplate();
	}

}

      RestTemplate:

             RestTemplate:提供多种便捷访问远程Http服务的方法。
             是一种简单便捷的访问restful服务模板类,是spring提供的用于访问Rest服务的客户端模板工具集。

             官网:docs.spring.io/spring-framework/docs/4.3.7.RELEASE/javadoc-api/org/springframework/web/client    

                       /RestTemplate.html。

             使用:使用restTemplate访问restful接口非常的简单。

                      (url,requestMap,ResponseBean.class)这三个参数分别代表REST请求地址、请求参数、Http响应

                         转换被转换成的对象类型。

   5.新建DeptController_Consumer

     在com.atguigu.springcloud.controller包下新建DeptController_Consumer

package com.atguigu.springcloud.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.atguigu.springcloud.entities.Dept;

@RestController
public class DeptController_Consumer {
	
	private static final String REST_URL_PREFIX="http://localhost:8001";
	
	@Autowired
	private RestTemplate restTemplate;
	
	@RequestMapping(value="/consumer/dept/add")
	public boolean add(Dept dept) {
		
		return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add", dept, boolean.class);
	}

    
	@RequestMapping(value="/consumer/dept/get/{id}")
	public Dept get(@PathVariable("id")Long id) {
		
		return restTemplate.getForObject(REST_URL_PREFIX+"/dept/get/"+id, Dept.class);
	}
	
	
	@SuppressWarnings("unchecked")
	@RequestMapping(value="/consumer/dept/list")
	public List<Dept> list() {
		
		return restTemplate.getForObject(REST_URL_PREFIX+"/dept/add", List.class);
	}


}

   6.创建启动类

      在com.atguigu.springcloud包下新建启动类DeptConsumer80_app(同生产者一样)

   7.测试

        

                

     

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
项目是采用目前比较流行的SpringBoot/SpringCloud构建微服务电商项目项目叫 《果然新鲜》,实现一套串联的微服务电商项目。完全符合一线城市微服务电商的需求,对学习微服务电商架构,有非常大的帮助,该项目涵盖从微服务电商需求讨论、数据库设计、技术选型、互联网安全架构、整合SpringCloud各自组件、分布式基础设施等实现一套完整的微服务解决方案。 项目使用分布式微服务框架,涉及后台管理员服务、地址服务、物流服务、广告服务、商品服务、商品类别服务、品牌服务、订单服务 、购物车服务、首页频道服务、公告服务、留言服务、搜索服务、会员服务等。  系统架构图   SpringBoot+SpringCloud+SSM构建微服务电商项目使用SpringCloud Eureka作为注册中心,实现服务治理使用Zuul网关框架管理服务请求入口使用Ribbon实现本地负载均衡器和Feign HTTP客户端调用工具使用Hystrix服务保护框架(服务降级、隔离、熔断、限流)使用消息总线Stream RabbitMQ和 Kafka微服务API接口安全控制和单点登录系统CAS+JWT+OAuth2.0分布式基础设施构建分布式任务调度平台XXL-JOB分布式日志采集系统ELK分布式事务解决方案LCN分布式锁解决方案Zookeeper、Redis分布式配置中心(携程Apollo)高并发分布式全局ID生成(雪花算法)分布式Session框架Spring-Session分布式服务追踪与调用链Zipkin项目运营与部署环境分布式设施环境,统一采用Docker安装使用jenkins+docker+k8s实现自动部署微服务API管理ApiSwagger使用GitLab代码管理(GitHub  GitEE)统一采用第三方云数据库使用七牛云服务器对静态资源实现加速 开发环境要求JDK统一要求:JDK1.8Maven统一管理依赖 统一采用Docker环境部署编码统一采用UTF-8开发工具IDEA 或者 Eclipse 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值