创建maven的依赖(父工程)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<groupId>com.tonyffd</groupId>
<artifactId>spring-cloud-study</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring.cloud-version>Hoxton.SR8</spring.cloud-version>
<spring.cloud.alibaba-version>2.2.5.RELEASE</spring.cloud.alibaba-version>
</properties>
<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>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
服务之间通信
同源策略是在浏览器中的,服务与服务之间通信没有跨域问题。
创建一个provider子工程和consumer子工程模拟服务提供和服务调用,在配置文件中添加依赖spring-boot-starter-web,使用restTemplate进行服务调用
首先需要在配置文件中配置restTemplate,或者在spring boot启动类配置也可以。
@Configuration
public class ResourceConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
provider提供接口:
@Value("server.port") //8081,已在appliction.yml中配置
private String port;
@GetMapping("/provider/echo/{msg}")
public String doRestEcho1(@PathVariable String msg){
return port+" say hello "+msg;
}
consumer调用接口:
@Value("${server.port}") //8091
private String port;
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/doRestEcho1")
public String doRestEcho01(){
String url = "http://localhost:8081/provider/echo/"+port;
System.out.println("request url:"+url);
return restTemplate.getForObject(url, String.class);
}
通过调用consumer的接口localhost:8091/consumer/doRestEcho1,consumer的服务去调用provider中的服务。
结果: 8081 say hello 8091
nacos注册中心
下载nacos https://github.com/alibaba/nacos/releases( 本人下载的时1.4.1版本)
下载后解压,进入conf文件夹进行配置。
- nacos-mysql.sql
DROP DATABASE IF EXISTS `nacos_config`;
CREATE DATABASE `nacos_config` DEFAULT character set utf8mb4;
SET names utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
USE `nacos_config`;
- mysql中导入该数据文件,生成数据文件
- 备份application.properties文件,防止修改后出错情况
- 配置application.properties文件中的数据库配置
###If use MySQL as datasource:
spring.datasource.platform=mysql
###Count of DB:
db.num=1
###Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=1234
- 在cmd命令行中输入
startup.cmd -m standalone
- 在浏览器中输入地址访问nacos
http://localhost:8848/nacos
账号密码默认都是nacos
nacos服务发现
在刚刚创建的consumer和provider模块中,添加nacos服务发现。(两个模块都是下面配置)
pom的依赖配置
<dependencies>
<!--Web服务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--服务的注册和发现(我们要讲服务注册到nacos)-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
application.yml配置
server:
port: 8081 #端口号,consumer的配置文件把port改为8091
spring:
application:
name: provider #应用名称,consumer的配置文件把name改为provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务发现nacos地址
重新启动两个服务后就可以在nacos的服务列表看到两个服务名称,就像淘宝的卖家和买家在淘宝平台注册一样。
在naocs注册后,可以更好的查找这些服务,nacos和服务之间通过心跳包机制检测服务还是否存在。可以使用restTemplate去调用服务。
nacos配置中心
在配置中心中,我们可以对项目进行动态的配置,比如数据库用户名,密码,线程池大小等信息做动态的配置。,这里只修改了provider的配置,以provider为测试对象。
- 在pom.xml文件中添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 把项目中原本的application.yml文件重命名为bootstrap.yml(启动优先级最高)
server:
port: 8081 #端口号
spring:
application:
name: provider #应用名称
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务发现nacos地址
config:
server-addr: localhost:8848 #配置中心nacos地址
group: DEFAULT_GROUP #配置组,默认为DEFAULT_GROUP
file-extension: yml #动态配置文件类型
- 在需要动态配置信息的位置添加@RefreshScope 这个注解,当nacos控制台上发布配置时,spring中会创建新的对象覆盖原来的对象,起到动态更新的效果。
@RefreshScope//动态刷新配置
@RestController
public class ProviderController {
@Value("${server.port}")
private String port;
@GetMapping("/provider/echo/{msg}")
public String doRestEcho1(@PathVariable String msg){
return port+" say hello "+msg;
}
}
-
重新启动服务,测试结果任然为8081 say hello 8091
-
在nacos控制台上修改配置信息
点击最右侧+,添加配置
在配置文件中修改provider服务的端口号为1234,dataId是服务的应用名,group是分组。配置模式中选择刚刚在bootstrap中配置的文件格式。(如果要用consumer调用,需要把调用接口的端口也修改为1234)
-
点击发布后 再次测试,结果为 1234 say hello 8091
命名空间
点击命名空间后我们可以看到,默认会有一个public的命名空间,当然我们也可以创建自己的命名空间
只填最后两个就可以了,命名空间id会自动生成。
我们再次回到配置列表界面可以看到可以选择dev命名空间进行配置,这样就可以把生产场景和发布场景做分离。当然还需在项目配置文件中指定命名空间和组。
namespace: f7328185-c077-47c3-ada4-0aad40717d63 #命名空间
Nacos配置管理模型
Nacos 配置管理模型由三部分构成,如图所示:
在这里插入图片描述
其中:
Namespace:命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境和⽣产环境。
Group:分组,将若⼲个服务或者若⼲个配置集归为⼀组。
Service/DataId:某⼀个服务或配置集,一般对应一个配置文件。