人人


一、码云新建仓库

1、新建仓库(前提git已经安装,已经申请注册码云)

2、仓库初始化

3、创建后复制这个地址

4、idea配置git

5、通过idea导入gitee的初始化的项目

6、配置gitee的项目地址

7、创建商品模块的微服务

web配置

openFeign配置

8、创建其他微服务,处理名称和上边的一样

给父工程添加一个pom,然后加到maven里

pom文件

<?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.0modelVersion>
    <groupId>com.stu.gulimallgroupId>
    <artifactId>gulimallartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>gulimallname>
    <description>聚合服务description>
    <packaging>pompackaging>

    <modules>
        <module>gulimall-couponmodule>
        <module>gulimall-membermodule>
        <module>gulimall-ordermodule>
        <module>gulimall-productmodule>
        <module>gulimall-waremodule>
    modules>

project>

添加到maven

9、git忽略文件配置

target/
#!.mvn/wrapper/maven-wrapper.jar
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar

**/mvnw
**/mvnw.cmd
**/.mvn

**/target/
**/mvnw.mvn
.idea

**/.gitignore

二、整合人人开源框架

1、下载项目

项目地址:https://gitee.com/renrenio

下载红框里的两个开源框架,下载后删除.git文件(可能隐藏了,隐藏了就显示出来)

将renren-fast放到工程下,并配置model

2、整合人人数据库

将mysql的数据sql复制到mysql链接工具,创建数据库并新建表,然后把数据库链接地址和密码修改成自己的

3、整合人人前端

官网下载node.js,一直下一步,安装路径可以修改为其他盘

安装node后,配置 npm 使用淘宝镜像

cmd命令窗口执行 npm config set registry http://registry.npm.taobao.org/

将renren-fast-vue用vscode打开

安装好node.js后,执行npm install,下载依赖,然后执行npm run dev

如果npm install报错,提示安装重启电脑基本解决,不好用卸载node,js切换其他版本,或者根据错误提示排查原因。

启动人人后端

访问

三、整合后端

1、创建公共微服务

1、创建服务

2、product添加刚建好的公共的依赖

3、把renren-fast的commons-lang依赖剪切到公共依赖里

4、把生成代码的权限注解先注释掉(先看14、整合人人代码生成器

注释掉后生成的controller文件就不会生成这个注解了

5、把生成代码的权限注解先注释掉

6、pom依赖

<?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">
    <parent>
        <artifactId>gulimallartifactId>
        <groupId>com.stu.gulimallgroupId>
        <version>0.0.1-SNAPSHOTversion>
    parent>
    <modelVersion>4.0.0modelVersion>

    <artifactId>gulimall-commonartifactId>
    <description>每一个微服务公共的依赖,bean,工具类等description>

    <dependencies>
        <dependency>
            <groupId>com.baomidougroupId>
            <artifactId>mybatis-plus-boot-starterartifactId>
            <version>3.5.1version>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <version>1.18.8version>
        dependency>
        
        <dependency>
            <groupId>org.apache.httpcomponentsgroupId>
            <artifactId>httpcoreartifactId>
            <version>4.4.12version>
        dependency>
        <dependency>
            <groupId>commons-langgroupId>
            <artifactId>commons-langartifactId>
            <version>2.6version>
        dependency>
        
        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>8.0.17version>
        dependency>
        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>servlet-apiartifactId>
            <version>2.5version>
            <scope>providedscope>
        dependency>
    dependencies>
project>

7、utils整合

把renren-fast下的一些工具类复制修改到公共模块里

2、整合人人代码生成器

项目地址:https://gitee.com/renrenio

下载后,删掉.git文件,整合到后端项目里,pom添加module

修改要生成的数据库和用户密码

修改generator文件

启动项目,生成代码

打开压缩包,看下内容

将生成代码里的main目录复制到product的src下的main里

3、整合gulimall-product

1、先进行数据库连接测试

启动类配置

package com.stu.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 1、整合MyBatis-Plus
 *      1)、导入依赖
 *      
 *             com.baomidou
 *             mybatis-plus-boot-starter
 *             3.2.0
 *      
 *      2)、配置
 *          1、配置数据源;
 *              1)、导入数据库的驱动。https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-versions.html
 *              2)、在application.yml配置数据源相关信息
 *          2、配置MyBatis-Plus;
 *              1)、使用@MapperScan
 *              2)、告诉MyBatis-Plus,sql映射文件位置
 *
 * 2、逻辑删除
 *  1)、配置全局的逻辑删除规则(省略)
 *  2)、配置逻辑删除的组件Bean(省略)
 *  3)、给Bean加上逻辑删除注解@TableLogic
 *
 * 3、JSR303
 *   1)、给Bean添加校验注解:javax.validation.constraints,并定义自己的message提示
 *   2)、开启校验功能@Valid
 *      效果:校验错误以后会有默认的响应;
 *   3)、给校验的bean后紧跟一个BindingResult,就可以获取到校验的结果
 *   4)、分组校验(多场景的复杂校验)
 *         1)、    @NotBlank(message = "品牌名必须提交",groups = {AddGroup.class,UpdateGroup.class})
 *          给校验注解标注什么情况需要进行校验
 *         2)、@Validated({AddGroup.class})
 *         3)、默认没有指定分组的校验注解@NotBlank,在分组校验情况@Validated({AddGroup.class})下不生效,只会在@Validated生效;
 *
 *   5)、自定义校验
 *      1)、编写一个自定义的校验注解
 *      2)、编写一个自定义的校验器 ConstraintValidator
 *      3)、关联自定义的校验器和自定义的校验注解
 *      @Documented
 * @Constraint(validatedBy = { ListValueConstraintValidator.class【可以指定多个不同的校验器,适配不同类型的校验】 })
 * @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
 * @Retention(RUNTIME)
 * public @interface ListValue {
 *
 * 4、统一的异常处理
 * @ControllerAdvice
 *  1)、编写异常处理类,使用@ControllerAdvice。
 *  2)、使用@ExceptionHandler标注方法可以处理的异常。
 */

@MapperScan("com/stu/gulimall/product/dao")
@SpringBootApplication
public class GulimallProductApplication {

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

}

yml文件

#配置数据源
spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://123.57.149.21:3306/gulimaill_pms?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.jdbc.Driver
#设置@TableId主键自增
mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto

4、整合其他微服务

按照product把其他服务也整合好

共同点:
1、都先生成代码,把相应的代码复制到每个模块,注意修改数据库和表名,模块名
2、在各个服务的pom添加公共模块依赖
3、配置yml文件,指定好端口,数据库

四、整合Nacos注册中心

参考地址:https://github.com/alibaba/spring-cloud-alibaba

参照Nacos Discovery Example

前提已经下载好nacos

1、引入依赖(公共模块引入,其他模块引入公共模块)

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-alibaba-dependenciesartifactId>
            <version>2.2.1.RELEASEversion>
            <type>pomtype>
            <scope>importscope>
        dependency>
    dependencies>
dependencyManagement>

2、引入 Nacos Discovery Starter(公共模块引入,其他模块引入公共模块)

 <dependency>
     <groupId>com.alibaba.cloudgroupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
 dependency>

3、在应用的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址和名称

本文以yml格式为例

#配置数据源
spring:
  datasource:
    username: root
    password: root
    url: jdbc:mysql://123.57.149.21:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.jdbc.Driver
  cloud:
    nacos:
      discovery:
        server-addr: 123.57.149.21:8848
  application:
    name: gulimall-coupon
#设置@TableId主键自增
mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto
server:
  port: 7000

4、使用 @EnableDiscoveryClient 注解开启服务注册与发现功能

 @SpringBootApplication
 @EnableDiscoveryClient
 public class ProviderApplication {

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

     @RestController
     class EchoController {
         @GetMapping(value = "/echo/{string}")
         public String echo(@PathVariable String string) {
                 return string;
         }
     }
 }

5、项目里完整nacos注册代码参照

公共模块pom

<?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">
    <parent>
        <artifactId>gulimallartifactId>
        <groupId>com.stu.gulimallgroupId>
        <version>0.0.1-SNAPSHOTversion>
    parent>
    <modelVersion>4.0.0modelVersion>

    <artifactId>gulimall-commonartifactId>

    <description>每一个微服务公共的依赖,bean,工具类等description>

    <dependencies>
        <dependency>
            <groupId>com.baomidougroupId>
            <artifactId>mybatis-plus-boot-starterartifactId>
            <version>3.5.1version>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <version>1.18.8version>
        dependency>
        
        <dependency>
            <groupId>org.apache.httpcomponentsgroupId>
            <artifactId>httpcoreartifactId>
            <version>4.4.12version>
        dependency>
        <dependency>
            <groupId>commons-langgroupId>
            <artifactId>commons-langartifactId>
            <version>2.6version>
        dependency>
        
        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>8.0.17version>
        dependency>
        <dependency>
            <groupId>javax.servletgroupId>
            <artifactId>servlet-apiartifactId>
            <version>2.5version>
            <scope>providedscope>
        dependency>

        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
    dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>2.2.1.RELEASEversion>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>


project>

其他模块pom

<?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.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.6.3version>
        <relativePath/> 
    parent>
    <groupId>com.stu.gulimallgroupId>
    <artifactId>gulimall-couponartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>gulimall-couponname>
    <description>Demo project for Spring Bootdescription>
    <properties>
        <java.version>1.8java.version>
        <spring-cloud.version>2021.0.0spring-cloud.version>
    properties>
    <dependencies>
        <dependency>
            <groupId>com.stu.gulimallgroupId>
            <artifactId>gulimall-commonartifactId>
            <version>0.0.1-SNAPSHOTversion>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-openfeignartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
    dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>

project>

其他模块yml

#配置数据源
spring:
  datasource:
    username: xxxxx
    password: xxxxx
    url: jdbc:mysql://xxx:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.jdbc.Driver
  cloud:
    nacos:
      discovery:
        server-addr: xxxxx:8848
  application:
    name: gulimall-coupon
#设置@TableId主键自增
mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml
  global-config:
    db-config:
      id-type: auto
server:
  port: 7000

其他模块启动类

package com.stu.gulimall.coupon;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class GulimallCouponApplication {

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

}

启动nocas并启动后端项目测试

五、OpenFeign测试远程调用

测试member远程调用coupon服务

1、common服务的pom添加如下配置

discovery不要添加重复

        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
            
                
                    org.springframework.cloud
                    spring-cloud-starter-netflix-ribbon
                
            
        dependency>

2、member服务的pom添加如下配置

        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-loadbalancerartifactId>
        dependency>

3、coupon服务的测试方法memberCoupon

package com.stu.gulimall.coupon.controller;

import java.util.Arrays;
import java.util.Map;

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.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.stu.gulimall.coupon.entity.CouponEntity;
import com.stu.gulimall.coupon.service.CouponService;
import com.stu.common.utils.PageUtils;
import com.stu.common.utils.R;



/**
 * 优惠券信息
 *
 * @author konglx
 * @email konglx@gmail.com
 * @date 2022-02-19 13:08:15
 */
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;

    @RequestMapping("/memberCoupon")
    public R memberCoupon() {
        CouponEntity couponEntity = new CouponEntity();
        couponEntity.setCouponName("fegin test");

        return R.ok().put("memberCoupon",Arrays.asList(couponEntity));
    }

}

4、member服务的controller测试方法test

package com.stu.gulimall.member.controller;

import com.stu.common.utils.PageUtils;
import com.stu.common.utils.R;
import com.stu.gulimall.member.entity.MemberEntity;
import com.stu.gulimall.member.fegin.CouponFeginService;
import com.stu.gulimall.member.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.Map;



/**
 * 会员
 *
 * @author konglx
 * @email konglx@gmail.com
 * @date 2022-02-19 15:26:54
 */
@RestController
@RequestMapping("member/member")
public class MemberController {
    @Autowired
    private MemberService memberService;

    @Autowired
    CouponFeginService couponFeginService;


    @RequestMapping("/coupons")
    public R test(){
        MemberEntity member = new MemberEntity();
        member.setNickname("member test");

        R r = couponFeginService.memberCoupon();
        return R.ok().put("list",r.get("memberCoupon"));
    }


}

5、member服务的启动类

package com.stu.gulimall.member;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;

/**
 * 1、远程服务调用
 * 1)、引入open-fegin
 * 2)、编写一个接口,告诉spring cloud这个接口需要调用远程接口服务
 *   声明接口的每一个方法都是调用哪个远程服务的哪个请求
 *  3)、开启远程调用功能
 *
 */

@EnableFeignClients(basePackages = "com.stu.gulimall.member.fegin")
@EnableDiscoveryClient
@SpringBootApplication
public class GulimallMemberApplication {

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

}

6、member服务的远程调用接口

package com.stu.gulimall.member.fegin;

import com.stu.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient("gulimall-coupon")
public interface CouponFeginService {

    @RequestMapping("/coupon/coupon/memberCoupon")
    public R memberCoupon();
}

 

7、启动nacos、coupon和member服务

游览器访问

六、Nocas配置中心测试

1、首先,在common服务的pom.xml 文件,引入 Nacos Config Starter和bootstrap。

        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-bootstrapartifactId>
            <version>3.0.3version>
        dependency>

2、在应用的 /src/main/resources/bootstrap.properties 配置文件中配置 Nacos Config 元数据

 spring.application.name=nacos-config-example
 spring.cloud.nacos.config.server-addr=127.0.0.1:8848

3、完成上述两步后,应用会从 Nacos Config 中获取相应的配置,并添加在 Spring Environment 的 PropertySources 中。这里我们使用 @Value 注解来将对应的配置注入到 SampleController 的 userName 和 age 字段,并添加 @RefreshScope 打开动态刷新功能

 @RefreshScope
 class SampleController {

     @Value("${user.name}")
     String userName;

     @Value("${user.age}")
     int age;
 }

4、application.properties属性文件

coupon.user.name=zhangsan
coupon.user.age=18

5、读取属性文件测试

package com.stu.gulimall.coupon.controller;

import java.util.Arrays;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.stu.gulimall.coupon.entity.CouponEntity;
import com.stu.gulimall.coupon.service.CouponService;
import com.stu.common.utils.PageUtils;
import com.stu.common.utils.R;



/**
 * 优惠券信息
 *
 * @author konglx
 * @email konglx@gmail.com
 * @date 2022-02-19 13:08:15
 */
@RestController
@RequestMapping("coupon/coupon")
public class CouponController {
    @Autowired
    private CouponService couponService;

    @Value("${coupon.user.name}")
    private String name;
    @Value("${coupon.user.age}")
    private Integer age;


    @RequestMapping("/test")
    public R configTest() {

        return R.ok().put("name",name).put("age",age);
    }
  

}

访问

6、假如已经上线,需要修改配置文件的内容,这时候需要先修改代码,代码重新打包然后发布部署,这时可以使用nacos的配置中心,不用重新打包发表就可以实现

首先,在nacos创建一个配置中心

发布

7、通过nacos修改属性文件的值,不需要修改代码重新打包部署程序

需要在controller的类上加上@RefreshScope注解

测试

七、Nocas配置中心命名空间和配置分组