父项目依赖
导入依赖
结果
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</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>
启动配置管理
子项目依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。
在 bootstrap.properties 中配置 Nacos server 的地址和应用名
# bootsrap.yml文件的内容优先加载,相同数据不会被替换,主要用于加载外部配置中心的内容,一般存放不变的配置内容
spring:
cloud:
nacos:
config:
server-addr: localhost:8848 #nacos配置中心地址:获取dataId名称为config-service.yml的配置内容
file-extension: yml
refresh-enabled: true #默认nacos数据更新则刷新到后台
application:
name: config-service
说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 p r e f i x . {prefix}. prefix.{file-extension}
file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新:
@RestController
@RefreshScope//配置文件修改自动刷新
public class NacosConfigController {
@Value("${msg}")
private String msg;
@Value("${person.name}")
private String name;
@Autowired
private PersonConfig personConfig;
@RequestMapping("/getMsg")
public String getMsg() {
return msg;
}
@RequestMapping("/getName")
public String getName() {
return name;
}
@RequestMapping("/getPersonConfig")
public PersonConfig getPersonConfig() {
return personConfig;
}
}
实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "person")
public class PersonConfig {
private Integer id;
private String name;
private String sex;
private Map<String,String> address;
}
nacos服务端数据
注意dataId和后台配置的id一致
启动服务发现
创建一个服务提供者
子项目依赖
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
</dependencies>
注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。
application.properties 中配置 Nacos server 的地址:
server:
port: 9102
spring:
application:
name: server-provider #应用名称
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务注册地址
heart-beat-interval: 1000 #心跳时间1000毫秒
heart-beat-timeout: 1000 #心跳超时时间1000毫秒
ip-delete-timeout: 1000 #踢出服务时间1000毫秒
控制层
@RestController
public class ServerProviderController {
@Value("${server.port}")
private Integer port;
@RequestMapping(value = "/hello")
public String hello(String name){
return "hello:"+name+",服务器端口:"+port;
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient//开启服务注册发现功能
public class ServerProvicerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerProvicerApplication.class);
}
}
服务消费者Ribbon
依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
配置文件
server:
port: 9201
spring:
application:
name: nacos-service-customer #应用服务名称
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务注册地址
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceCustomerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceCustomerApplication.class);
}
@Bean
@LoadBalanced//开启负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
控制层
@RestController
public class ServerCustomerController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/hello")
public String hello(String name) {//开启负载均衡后不把localhost:9101当作服务名称不当做地址
return restTemplate.getForObject("http://server-provider/hello?name=" + name, String.class);
}
服务消费者Feign
依赖
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
配置文件
server:
port: 9201
spring:
application:
name: nacos-service-customer #应用服务名称
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务注册地址
服务层
@FeignClient(value = "server-provider")//nacos上的服务名称自动将该类注入spring容器中
public interface NacosService {
//调用server-provider的hello接口
@RequestMapping(value = "/hello")
public String hello(@RequestParam("name") String name);
}
控制层
@RestController
public class ServerCustomerController {
@Autowired(required = false)
private NacosService nacosService;
@RequestMapping("/feignHell")
public String feignHell(String name) {
return nacosService.hello(name);
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients//开启Feign客户端调用
public class ServiceCustomerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceCustomerApplication.class);
}
@Bean
@LoadBalanced//开启负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}