一、创建maven总工程
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>
<groupId>com.almond</groupId>
<artifactId>mall</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mall</name>
<description>总项目</description>
<!--**********注意这嘎达打包方式是pom类型的**********-->
<packaging>pom</packaging>
<!--各模块在创建子modules时会加入到总工程中,idea如果不提示加入的话就手动呗-->
<modules>
<!--优惠券-->
<module>mall-coupon</module>
<!--会员-->
<module>mall-member</module>
<!--订单-->
<module>mall-order</module>
<!--商品-->
<module>mall-product</module>
<!--仓储-->
<module>mall-ware</module>
<!--人人开源后台-->
<module>renren-fast</module>
<!--人人开源代码生成-->
<module>renren-generator</module>
<module>mall-common</module>
</modules>
</project>
二、创建公共的资源module
将每一个子module都会用到的maven依赖加入到本module中,之后每个微服务module都引入这个module依赖
公共资源module的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mall</artifactId>
<groupId>com.almond</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall-common</artifactId>
<description>项目公共资源</description>
<dependencies>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.12</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<!--服务注册的依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<!--依赖管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
三、创建每一个子module
子module的pom里面都引入公共的module的依赖
就用一个pom文件创建一个为例子吧,其他的大同小异,某个module只有自己用到的依赖加在自己的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.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.almond</groupId>
<artifactId>mall-coupon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mall-coupon</name>
<description>优惠券服务</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR5</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>com.almond</groupId>
<artifactId>mall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--feign 远程服务调用依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</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>
四、实现服务注册
1. 在子module的application.yml中简单配置一哈
#嫩多的module需要启动你不配置端口号 莫不是脑子瓦特了???
server:
port: 8000
#这嘎达配置一下你的服务名字,后来实现远程调用的时候得用这玩意儿
spring:
application:
name: module-name
#这配置你的nacos-server启动的地址
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
2. 在主启动类中加入一个注解@EnableDiscoveryClient
这注解表示把服务加到nacos的服务注册中心,好像不加也行,懒得加可以尝试一下
3.启动嫩的module,在你的nacos管理页面(本机)看一下服务就没有在里面注册成功,这玩意第一次得登录,默认的用户名和密码都是nacos
五、远程服务调用
远程调用俺用的是openFeign,so: 他的依赖就是。。。。。。
<!--feign 远程服务调用依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在需要远程调用的module下建一个包包,专门用来放远程调用的服务接口,然后建一个接口
远程调用别人的服务的接口代码
import com.almond.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
//这玩意就是说这是一个需要远程调用被人的接口 也就是远程调用的客户端
@FeignClient("module-name")
public interface RemoteCouponService {
//这地方一定要写被你远程调用的请求地址的全路径,404的时候别说没提醒嫩熬
//注意请求方式,你调用人家的接口,你不得听人家的安排吗????
@GetMapping("/coupon/coupon/member/list")
public R memberCoupons();
}
//这嘎达就是需要远程调用别人的module的主启动类
@SpringBootApplication
@EnableDiscoveryClient
//你得告诉人家你的远程调用客户端是在哪个包包下
@EnableFeignClients(basePackages = "com.almond.member.feign")
public class MallMemberApplication {
public static void main(String[] args) {
SpringApplication.run(MallMemberApplication.class, args);
}
}
被别人远程调用的服务的接口代码,这就是你controller包包下的接口
@RestController("/coupon/coupon")
public class CouponController(){
@GetMapping("/member/list")
public R getList(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满100减10");
return R.ok().put("list", Arrays.asList(couponEntity));
}
}
尝试一哈,在需要调用的module里面写一个接口测试一下远程服务调用行不行
@RestController("/member/member")
public class CouponController(){
//这个注入 不用多bb
@Autowired
private RemoteCouponService remoteCouponService;
@PostMapping("/couponList")
public R couponList(){
R coupons = remoteCouponService.memberCoupons();
return coupons;
}
}
使用postman访问一下试试
localhost:8554/member/member/couponList
六、nacos做为配置中心
首先引入maven依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
在项目的model中新建一个名叫bootstrap.properties的SpringBoot配置文件关于SpringBoot配置文件
spring.application.name=mall-coupon
#服务配置中心
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
在服务启动时就会去加载nacos配置中心中添加的配置
测试配置中心
1. 在配置中心中新建一个配置,并发布
2. 新建或者在已有的controller中加入如下代码
@RestController
@RequestMapping("/test")
public class testController{
@Value("${my.name}")
private String name;
@PostMapping("/testConfig")
public R testConfig(){
return R.ok().put("name", name);
}
}
3. 使用postman测试,查看返回的数据和配置的数据一致代表成功.
BUT!!!现在在nacos中修改配置文件,将name改为lisi,postman重新发送请求,发现得到的name还是zhangsan,使用@RefreshScope
注解即可达到实时刷新配置.
七、多环境、多服务配置
开发中那必须得分开环境叭,那就需要进行多环境的配置,并且每个服务的各自配置也有所不同,nacos支持配置集配置
在nacos中可以创建多个命名空间,可以为每个服务提供一个自己独有的空间,以后每个服务只去加载自己独有的配置就行啦
以上是多服务配置
多环境配置也是可以实现滴,只要在各自服务的命名空间中创建配置文件时指定配置分组就可以啦
八、加载多个配置集
啥玩意是配置集啊???
配置集就是配置的集合呗,在服务的配置文件中是不是配置了很多内容,有spring的,有mybatis的…
现在可以针对每一个内容进行配置,配置见相互组合达到共同生效配置的功能,以前的application.yml文件也可以暂时退休了
只需要在bootstrap.properties中加载nacos配置中心的配置就可以了
spring.application.name=mall-coupon
#服务注册与发现
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#服务配置中心
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#配置中心命名空间, 每个微服务使用自己的空间
#c684459c-84b7-4036-bc3f-ff4d777024d3这东西是你自己配置的命名空间的id
spring.cloud.nacos.config.namespace=c684459c-84b7-4036-bc3f-ff4d777024d3
#命名空间分组 这里根据环境设置分组
#spring.cloud.nacos.config.group=dev
#加载多配置集
#数据源
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true
#mybatis
spring.cloud.nacos.config.ext-config[1].data-id=mybatis-plus.yml
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].refresh=true
#其他配置
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].refresh=true