SpringCloud調用服務示例。
SpringCloud簡介:
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring並沒有重復制造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,通過Spring Boot風格進行再封裝屏蔽掉了復雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。
SpringCloud與Springboot內部以及集成好了,可以直接使用SpringBoot.
使用SpringCloud的調用需要新建三個maven項目,分別為eureka-server(服務注冊中心) server-member(服務提供方) server-order(服務消費方)
(1)maven項目 eureka-server ,服務注冊方(類似於dubbo中使用的 zookeeper)
項目目錄結構如下: 需要編寫的三個文件(EurekaApp.java application.yml pom.xml)
EurekaApp.java SpringBoot的啟動類,主要用於啟動項目,讀取配置文件信息
記得要添加注解 @EnableEurekaServer ,標明這是個服務注冊中心
package springcloud.eureka_server.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * springcloud的注冊中心 * @author Administrator * 啟動后,在瀏覽器通過 localhost:8888訪問 */ @SpringBootApplication @EnableEurekaServer public class EurekaApp { public static void main(String[] args){ SpringApplication.run(EurekaApp.class, args); } }
application.yml SpringCloud的主配置文件,里面定義配置信息
port 訪問指定端口號
defaultZone 指定訪問路徑為 http://localhost:8888
server: port: 8888 # 指定該Eureka實例的端口 eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
pom.xml Springboot與SpringCloud的依賴文件
<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 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>springcloud</groupId> <artifactId>eureka-server</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>eureka-server Maven Webapp</name> <url>http://maven.apache.org</url> <!-- 引入spring boot的依賴 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.3.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.7</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> </dependencies> <!-- 引入spring cloud的依賴 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- 添加spring-boot的maven插件 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
啟動項目
運行EurekaApp.java ,Run as --- >> Java Application
啟動成功后,在瀏覽器訪問: http://localhost:8888
訪問結果如下圖所示:
(2)maven項目server-member ,服務提供方 (類似dubbo的provider)
項目目錄結構如下,需要編寫的文件有四個(MemberApp.java Member.controller.java application.yml pom.xml)
MemberController.java 服務提供方的前端控制器類
@RestController 定義返回json數據
@RequestMapping 定義請求訪問路徑為 getMember
package springcloud.server_member.demo.controller; import java.util.ArrayList; import java.util.List; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 會員服務 * @author Administrator * */ @RestController public class MemberController { @RequestMapping("/getMember") public List<String> getMember(){ List<String> list = new ArrayList<String>(); list.add("zhangsan"); list.add("zhangsan1"); list.add("zhangsan2"); list.add("zhangsan3"); return list; } }
MemberApp.java 項目的SpringBoot啟動類
記得使用 @EnableEurekaClient 注解 標明這是一個服務Client,需要注冊在eureka上的一個服務
package springcloud.server_member.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; /** * 啟動會員服務 * @author Administrator * * 服務的調用: reset feign */ @SpringBootApplication @EnableEurekaClient public class MemberApp { public static void main(String[] args){ SpringApplication.run(MemberApp.class, args); } }
application.yml SpringCloud的配置文件
server.port 定義訪問的端口
spring.application.name 定義服務名,在服務消費方通過這個服務名調用服務!(很重要哦)
eureka: client: serviceUrl: defaultZone: http://localhost:8888/eureka/ server: port: 8762 spring: application: name: server-member
pom.xml SpringCloud與SpringBoot的包依賴
<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 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>springcloud</groupId> <artifactId>server-member</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>server-member Maven Webapp</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.3.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.7</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.objenesis</groupId> <artifactId>objenesis</artifactId> <version>1.2</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</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> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
啟動項目 (這個項目啟動前需要先啟動 eureka-server項目)
運行MemberApp.java ,Run as --- >> Java Application
啟動成功后,在瀏覽器訪問: http://localhost:8762/getMember
訪問結果如下圖所示:
同時再次訪問服務注冊中心 eureka-server項目,會出現如下結果,Instance下廚多出一行服務
(3)maven項目 server-order 服務消費方(類似dubbo的customer)
項目目錄結構如下: 需要編寫的文件有五個(OrderController.java OrderService.java OrderApp.java application.yml pom.xml)
OrderService.java 服務消費方的業務類,在這里調用服務提供方的服務
RestTemplate 是框架中定義的rest服務調用
restTemplate.getForObject("http://server-member/getMember", List.class); 這是調用服務名為 server-member的服務中的 getMember請求對應的方法 (這里與上一個maven項目server-member項目中的配置相對應)
package springcloud.server_order.demo.service; import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @Service public class OrderService { @Autowired private RestTemplate restTemplate; /** * http: 這里是寫member-server里面的訪問路徑。 getMember是訪問方法 * @return */ public List<String> getAllUser(){ return restTemplate.getForObject("http://server-member/getMember", List.class); } }
OrderController.java 服務消費者的前端控制類。
使用@Autowired注解 注入業務層對象,調用業務層方法
package springcloud.server_order.demo.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import springcloud.server_order.demo.service.OrderService; @RestController public class OrderController { @Autowired private OrderService orderService; @RequestMapping("/getOrderUser") public List<String> getAllUser(){ System.out.println("訂單服務正在測試會議服務"); return orderService.getAllUser(); } }
OrderApp.java 項目的SpringBoot啟動類
@EnableEurekaClient 標識這是一個服務client,需要注冊到 Eureka注冊中心
@LoadBalanced 標識服務的調用,需要用到負載均衡
package springcloud.server_order.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableEurekaClient public class OrderApp { public static void main(String[] args){ SpringApplication.run(OrderApp.class, args); } /** * 表示支持負載均衡 * @return */ @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }
application.yml Springcloud的配置文件
eureka.client.serviceUrl.defaultZone 注冊中心的地址
server.port 訪問服務的端口
spring.application.name 服務名稱
eureka: client: serviceUrl: defaultZone: http://localhost:8888/eureka/ server: port: 8764 spring: application: name: server-order
pom.xml 項目的包依賴(SpringBoot與SpringCloud)
<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 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>springcloud</groupId> <artifactId>server-order</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>server-order Maven Webapp</name> <url>http://maven.apache.org</url> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.objenesis</groupId> <artifactId>objenesis</artifactId> <version>1.2</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</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> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
啟動項目(啟動這個項目之前需要先啟動 eureka-server server-member)
運行OrderApp.java ,Run as --- >> Java Application
啟動成功后,在瀏覽器訪問: http://localhost:8764/getOrderUser
訪問結果如下圖所示: