人人
一、码云新建仓库
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)、导入依赖 ** * 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); } }com.baomidou *mybatis-plus-boot-starter *3.2.0 *
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>dependency> org.springframework.cloud spring-cloud-starter-netflix-ribbon
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注解
测试