剛開始沒看懂是什麽一個情況,自己根據其他人提供的信息寫了一個例子出來就發現了是怎麽回事。
一共有三方需要提供,一個是服務提供方,一個是consul服務管理中心,還有一個面嚮客戶的服務。
首先啓動consul,我這裏使用的是最簡單的 consul agent -dev 命令來啓動它
之後我們需要先寫一個服務提供方,我這裏將部分代碼貼出,這是pom文件,只引入了web和consul的jar
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.eros.cloud</groupId> <artifactId>web-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>web-demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- consul 服务注册和发现功能 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
之後使用@EnableDiscoveryClient來開啓服務
consul一般配置都是在bootstarp.yml中,我不清楚爲啥不配在application.yml中,可能是默認會掃描bootstarp.yml。但是我試了下,我們啓動項目時,會先讀取application.yml.
application.yml
server: port: 18901 spring: application: name: provider
bootstrap.yml
spring: cloud: consul: host: localhost # consul所在服務地址 port: 8500 # consul端口 discovery: health-check-path: /actuator/health service-name: ${spring.application.name} # 服務提供者名稱 heartbeat: enabled: true
其实到这,我们实现了最简单的东西,但是还未提供注册的服务,下面是注册到consul的服务,后面其他地方会使用到这里的服务提供者名称及MVC提供的访问路径。
@RestController public class UserController { @Autowired private DiscoveryClient discoveryClient; @GetMapping(value = "hello") public String test(){ List<String> services = discoveryClient.getServices(); for(String service : services){ System.out.println(service); } return "hello spring cloud!"; } @GetMapping(value = "nice") public String nice(){ List<String> services = discoveryClient.getServices(); for(String service : services){ System.out.println(service); } return "nice to meet you!"; } }
到这,服务提供方的代码就基本完成了。接下来我们将了解面向客户的服务代码。
首先我们创建项目,导入相关的jar,pom.xml大致就这些,这里只放核心的jar,
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>
<!-- 使用feign开启访问 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
application.yml 配置
server: port: 18902 spring: application: name: comsumer cloud: consul: host: localhost port: 8500 discovery: register: false # 不进行注册 health-check-url: /actuator/health heartbeat: enabled: true
然后使用@EnableFeignClients注解,开启feign功能
然后使用@FeignClient注解,指定访问的服务提供者名称,服务路径指定为注册路径即可。如此,我们算是实现了最简单的一个cloud服务。
@FeignClient(name = "provider") public interface ProviderService { @RequestMapping("/hello") public String hello(); }