昨天咱们玩玩了renren-generator,单体架构是玩玩了,无非是后面根据你的需求增加其他的组件,完成你的另一种CURD。那么今天我们在来玩玩分布式,我们把WhiteHole最基本的后端项目搭建起来的分布式架构搭建起来。
ok,我们来开始吧,我们把最简单的部分搭建起来。然后用当前比较方便,主流,高效的方案去做整合。
首先是注册中心,然后配置中心,然后是远程连接,然后是网关,那么配置注册中心呢,我们都可以使用Nacos来做,事实上,这个Nacos将会充当更多的功能在本项目当中,远程调用当然还是openfeign,之后是GateWay 网关,那么为什么我要写这篇博文呢,主要是为了水博客,顺便方便自己以后copy配置。
注意这里是最基础的配置,例如你的ES,分布式事务,权限中心呀,那是和你业务相关的,跟这篇博客没关系,我这是最基本的。
在开始本文之前,我先重申一下我的环境版本,如果你要按照我这来玩,请务必保持和我一样的版本。如果没有按照这个版本来,发生了一些不友好的事情最后的解决方案除了砸电脑,最好的方案可能就是换回我在这里给出版本,这里面有很多问题,但是这个选择咱们这个版本的话。高版本组件可兼容,低版本也能用。
SpringBoot:2.3.2.RELEASE
SpringCloud:Hoxton.SR9
SpringCloudAlibaba:2.2.6.RELEASE
nacos:1.14
废话不多说,那么现在我们第一步需要做到是通过nacos进行微服务注册,这一步其实非常简单,比先前的eureka还要简单。首先导入依赖,我这里以WhiteHole项目为例。
导入nacos依赖,这里重申一遍就是这里使用的nacos服务端版本为1.x版本的不是2.x版本的,SpringCloudAlibaba 2.2.6 为分界线,往上为2.x往下为1.x如果你是比这个版本低,你用的nacos服务端必须降低到1.x否则报错。2.x以上版本建议使用docker,因为有额外的权限,端口需要打开,直接使用docker更方便,此外本人电脑为戴尔游匣G5,当前演示系统为win10,通过测试nacos1.4x版本用不了建议使用1.1x这个版本可以使用。
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
接下来我们测试一下,启动所有服务。
可以看到服务正常
这个也是一样的老规矩,导入依赖
org.springframework.cloud
spring-cloud-starter-openfeign
我这里之所以不写版本号,是因为我的父工程只是做了聚合管理,所有的子工程在创建的使用其父都是SpringCloud,它里面做了版本管理
2. 编写调用接口
这里的话其实有很多种方法,这里演示最简单的方法去使用,其实我更想做的是集成到comment里面,因为毕竟是作为一个公共组件嘛,但是我又不想出现上帝组件,就先这凑合吧。
我这边创建了一个包
我这里演示的是调用blog模块。
之后是调用,这个也简单:
@Autowired
BlogFeignService blogFeignService;
@RequestMapping("/test")
public R test(){
Map<String, Object> map = new HashMap<>();
R list = blogFeignService.list(map);
return list;
}
上面的ok了接下来就是配置中心了。
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
到这里就完成了,现在我们验证一下对不对。
现在我在activity的controller服务下面创建了一个test,专门用来测试的。
可以看到:
import java.util.HashMap;
import java.util.Map;
@RefreshScope
@RestController
public class Test {
@Autowired
BlogFeignService blogFeignService;
@RequestMapping("/testfeign")
public R test(){
Map<String, Object> map = new HashMap<>();
R list = blogFeignService.list(map);
return list;
}
@Value("${activity.name}")
private String name;
@RequestMapping("/testapp")
public R testapp(){
return R.ok().put("name",name);
}
}
我在配置文件当中写了一个配置
然后用@Value读取了。
之后这里注意的是我还打了一个注解
@RefreshScope
这个玩意会帮助我们动态刷新。
之后我去nacos配置中心配置一个新的配置文件
访问测试页面成功访问我这边的配置。
这里的话,Nacos就差不多了,我这里只是演示,实际怎么配的看你自己,我这里也只是演示罢了。像什么分组呀,命名空间,配置隔离神马神马的看你的业务了。
这个也简单,我这里的话就单纯的做一个转发,首先我已经把我的各个服务都放在nacos服务注册中心,所以的话这边就用GateWay直接做一个转发看看就好了。
org.springframework.cloud
spring-cloud-starter-gateway
这里的话,我只直接在网关服务里面导入了。因为这边网关只有一个嘛。
然后这个玩意啥都不用干,直接导入配置就ok了。
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
service: gateway
gateway:
discovery:
locator:
enabled: true
routes:
#这里先做一个基本的服务转发
- id: activiy8000
uri: lb://activiy
predicates:
- Path=/activiy/**
filters:
- StripPrefix=1
- id: blog8050
uri: lb://blog
predicates:
- Path=/blog/**
filters:
#- 转发做拼接,去掉provide后缀,uri/** 而不是 uri/provide/**
- StripPrefix=1
# 与之对于的还有 PrefixPath=/Huterox
# 当访问 http://localhost:8762/aaa,加上前缀就变成 http://localhost:8762/Huterox/aaa
- id: community8100
uri: lb://community
predicates:
- Path=/community/**
filter:
- StripPrefix=1
- id: hole8150
uri: lb://hole
predicates:
- Path=/hole/**
filter:
- StripPrefix=1
- id: quiz8200
uri: lb://quiz
predicates:
- Path=/quiz/**
filter:
- StripPrefix=1
- id: user8250
uri: lb://user
predicates:
- Path=/user/**
filter:
- StripPrefix=1
application:
name: gateway
server:
port: 88
然后我们测试一下,现在我在启动两个服务。
然后去通过网关访问:
一切正常,当然我这里还没有写入数据所以啥都没有。至此,一个非常简单的分布式项目就完成了基本的创建。