微服务分布式(二、注册中心Consul)
首先我们需要安装consul,到官网下载Consul
Install | Consul | HashiCorp Developer
在解压的consul目录下 执行启动命令
consul agent -dev 启动服务
-dev表示开发模式 -server表示服务模式
启动后在浏览器访问8500端口
http://localhost:8500/可以看到服务管理界面
项目要注册到中心需要做一些改动
一、添加pom依赖
添加cloud依赖
<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> 添加consul依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>
二、添加yml文件中的consul配置
spring: application: name: test-demo #注册到注册中心名称 cloud: consul: host: localhost #注册中心服务ip port: 8500 discovery: heartbeat: enabled: true service-name: ${spring.application.name} prefer-ip-address: true
三、启动类添加注解
@EnableDiscoveryClient 应用可以自动注册到服务注册中心。
@EnableDiscoveryClient
@SpringBootApplication
public class Mis001Application {
public static void main(String[] args) {
SpringApplication.run(Mis001Application.class, args);
}
}
到这里我们就配置好了项目的注册,启动后该服务会自动注册到注册中心
启动项目后我们在注册中心可以看到注册的服务,可以看到我们注册的服务
通过
LoadBalancerClient和DiscoveryClient 可以读取注册中心服务的信息
操作Consul的K/v存储
我们先在Consul中新建一个文件
写完之后点击下面的保存
下面我们修改我们的项目
1.首先我们在pom文件中添加依赖
<!--consul 添加K/V存储-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
2.在配置文件中添加consul中的config配置信息
spring:
application:
name: test-demo #注册到注册中心名称
cloud:
consul:
host: localhost #注册中心服务ip
port: 8500
discovery:
heartbeat:
enabled: true
service-name: ${spring.application.name}
prefer-ip-address: true
config:
profile-separator: ',' #默认的分隔符为 "," 我们自定义为"-"
format: yaml #文件格式为yml
fail-fast: true
prefix: config #基础文件夹名称
default-context: application
data-key: data
新建Myconfig类
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
/**
* 获取consult config 的key/vlue
*/
@RefreshScope
@ConfigurationProperties(prefix = "jdbc")
public class MyConfig {
private String username;
private String password;
private My my;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public My getMy() {
return my;
}
public void setMy(My my) {
this.my = my;
}
}
My 类
public class My {
private String year;
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
}
新建ConfigController
@RestController
public class ConfigController {
@Autowired
private MyConfig myConfig;
@RequestMapping("/getMyConfig")
public String getMyConfig(){
return myConfig.toString();
}
@RequestMapping("/getUsername")
public String getUsername(){
return myConfig.getUsername();
}
@RequestMapping("/getYear")
public String getYear(){
return myConfig.getMy().getYear();
}
}
启动类添加注解 使 @ConfigurationProperties 注解的类生效。
@EnableConfigurationProperties({MyConfig.class})
到此我们完成配置,可以启动项目访问我们controller中的方法获取到我们在Consul的配置文件里的值
但是这里有一个问题,开始我配置的内容写到了application-uat配置文件中,启动后获取不到方法,然后我把内容写到bootstrap.yml中就可以访问到了
bootstrap.yml
#bootstrap.yml是系统级的,优先级更加高
spring:
application:
name: test-demo
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
prefer-ip-address: true
config:
profile-separator: ',' #默认的分隔符为 "," 我们自定义为"-"
format: yaml #文件格式为yml
fail-fast: true
prefix: config #基础文件夹名称
default-context: application
data-key: data