主要的版本如下:
<spring-boot.version>2.3.12.RELEASE</spring-boot.version>
<spring-cloud.version>2.2.1.RELEASE</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
再次更新为:
<spring-boot.version>2.5.3</spring-boot.version>
<spring-cloud.version>2020.0.3</spring-cloud.version>
<spring-cloud-alibaba.version>2020.0.RC1</spring-cloud-alibaba.version>
架构实现的demo功能有nacos的配置中心、服务注册中心、服务的注册于消费、gateway网关的基础配置等
先下载一个nacos 我用的比较新2.0.2的版本,貌似还有个2.0.3的版本。
下载完成之后 根据自己的情况执行cmd(window版)或sh(linux版)命令,因为是学习一般都是单独运行,需要在后面补上 -m standalone
例如我的是window版 命令就是: startup.cmd -m standalone
注意8848端口 别被占用了
启动之后登陆nacos,登陆地址:http://127.0.0.1:8848/nacos 账号:nacos/nacos
配置最好用自己的项目名称,不用也可以单独配置。
配置完成之后 然后就是上代码了。
在maven里面配置主项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.htgx.acp</groupId>
<artifactId>acp</artifactId>
<version>1.0.0</version>
<!-- 系统jar版本管理-->
<properties>
<acp.version>1.0.0</acp.version>
<java.version>1.8</java.version>
<spring-cloud.version>2.2.1.RELEASE</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
<alibaba-druid.version>1.2.6</alibaba-druid.version>
<pagehelper.version>1.3.0</pagehelper.version>
<tk.mybatis.version>2.1.5</tk.mybatis.version>
<fastjson.version>1.2.9</fastjson.version>
</properties>
然后是服务注册于消费的项目的maven主配置,详细的可以看项目里面的配置。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${spring-cloud-alibaba.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${spring-cloud.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
启动类,不用数据库的 可以去掉MapperScan 注解
/**
* @author andy.wang
* @className ApplicationCenterApplication
* @Date 2021/7/26 14:53
*/
@MapperScan("com.htgx.acp.applicationcenter.mapper")
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ApplicationCenterApplication {
public static void main(String[] args) {
SpringApplication.run(ApplicationCenterApplication.class, args);
}
}
然后是 bootstrap.yml 配置 ,注意 用配置中心的一定要用bootstrap 不能直接使用application 配置。
server: port: 8860 servlet: context-path: /acp-application-center spring: application: name: acp-application-center cloud: nacos: discovery: server-addr: 172.16.6.32:8848 #不需要配置中心可以注释掉下面的配置 config: server-addr: 172.16.6.32:8848 file-extension: properties
application 配置
spring:
profiles:
active: @profileActive@
logging:
config: classpath:logback.xml
mybatis:
mapper-locations: classpath*:/mapper/*.xml
configuration:
#org.apache.ibatis.logging.stdout.StdOutImpl 控制台打印sql语句方便调试sql语句执行错误
#org.apache.ibatis.logging.log4j2.Log4j2Impl:这个不在控制台打印查询结果,但是在log4j中打印
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
pagehelper:
helper-dialect: mysql
reasonable: true
support-methods-arguments: true
params: count=countSql
然后是服务的消费使用,注意项目名称 和path路径,我的是一样的 如果不一样配置也要注意。
@FeignClient(name = "acp-application-center",path = "acp-application-center")
public interface Test {
@RequestMapping("/tLabel/findOne")
TLabel findOne(Map param);
}
然后是Controller 类的demo代码,配置中心有两种实现方式一种是boot 一种是cloud 。我这边是cloud的方式 RefreshScope 注解是标注跟随配置中心刷新配置。
@Slf4j
@RestController
@RequestMapping("/tLabel")
@RefreshScope
public class TLabelController {
@Autowired
private TLabelService tLabelService;
@RequestMapping(value="/findOne")
public TLabel findOne(@RequestBody Map param){
String idStr = (String)param.get("id");
Long id = Long.parseLong(idStr);
TLabel tLabel = tLabelService.selectByPrimaryKey(id);
System.out.println(JSON.toJSONString(tLabel));
return tLabel;
}
@Value(value = "${ones}")
private String ones;
@Autowired
private Test test;
@RequestMapping(value="/findOneTest")
public TLabel findOneTest(@RequestBody Map param){
System.out.println("nacos config:"+ones);
return test.findOne(param);
}
启动之后 用postman 测试下接口能不能用 ,再接着配置网关。pom配置
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--gateway网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>
启动类配置
@EnableDiscoveryClient
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
配置
server:
port: 9001
spring:
application:
name: ac-gateway
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
discovery:
locator:
enabled: false
#开启小写验证,默认feign根据服务名查找都是用的全大写
lowerCaseServiceId: true
routes:
- id: client-test
uri: lb://CLIENT-TEST
predicates:
- Path=/testclient/**
filters:
- StripPrefix=1
- id: service-feign
uri: lb://FEIGN
predicates:
- Path=/service-feign/**
filters:
- StripPrefix=1
启动之后把之前测试的端口调整到gateway 服务器来再试试。
项目下载地址:
再次把配置更新到nacos配置中心去,创建命名空间来区分不同的环境。
配置放在不同的命名空间里面,到时候服务也是类似的把不同环境隔离开来。
具体的配置 在代码里面有注释可以看。