SpringCloud之服务提供和服务调用的搭建
pom文件:
<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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.toov5</groupId> <artifactId>member</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> </parent> <!-- 管理依赖 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.M7</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- SpringBoot整合Web组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- SpringBoot整合eureka客户端 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> <!-- 注意: 这里必须要添加, 否者各种依赖有问题 --> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/libs-milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> </project>
yml文件:
###服务启动端口号 server: port: 8000 ###服务名称(服务注册到eureka名称) spring: application: name: app-toov5-member ###服务注册到eureka地址 eureka: client: service-url: ##当前会员注册到eureka服务 地址+端口号 defaultZone: http://127.0.0.1:8100/eureka ###因为该应用为注册中心,不会注册自己 这里 这两个可以不写 register-with-eureka: true ###是否需要从eureka上获取注册信息 fetch-registry: true
controller类
package com.toov5.api.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MemberApiController { @RequestMapping("/getMember") public String getMember() { return "会员服务"; } }
启动类
package com.toov5.api.app; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient //注册到eureka public class AppMember { public static void main(String[] args) { SpringApplication.run(AppMember.class, args); } }
先启动eureka,再启动服务:
上面Eureka会帮助生成地址~
(通过获取服务名字 然后获取访问地址)
服务调用:
客户端调用工具 SpringCloud里面有rest Spring boot帮助整合的,底层封装了Http Client 默认整合了ribbon负载均衡器
feign(spring cloud里面的)
解决RestTemplate注册到spring boot 容器中 @bean 方式
如果使用RestTemplate 方式以别名方式进行调用,依赖Ribbon负载均衡器 @LoadBalanced
@LoadBalanced就能让这个RestTemplate在请求时拥有客户端负载均衡的能力
yml:
###服务启动端口号 server: port: 8001 ###服务名称(服务注册到eureka名称) spring: application: name: app-toov5-order ###服务注册到eureka地址 eureka: client: service-url: defaultZone: http://localhost:8100/eureka ###因为该应用为注册中心,不会注册自己这里 这两个可以不写
register-with-eureka: true ###是否需要从eureka上获取注册信息 fetch-registry: true
controller
package com.toov5.api.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class OrderController { @Autowired private RestTemplate restTemplate; @RequestMapping("/getOrder") // 订单服务调用会员服务 public String getOrder() { // 一种直接调用,一种服务别名调用 // String result = restTemplate.getForObject("http://localhost:8000/getMember", String.class); String url ="http://app-toov5-order/getMember"; //使用别名去注册中心找对应服务调用地址 String result = restTemplate.getForObject(url, String.class); System.out.println("订单服务调用会员服务result" + result); return result; } }
启动类
package com.toov5.api.controller; 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 AppOrder { public static void main(String[] args) { SpringApplication.run(AppOrder.class, args); } //解决RestTemplate找不到问题 把restTemplate注册到Spring Boot容器中 如果要使用别名 必须加 @LoadBalanced @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }
两个都启动后有两个服务了
访问之,
可以多启动几个Member服务,可以实现本地负载均衡哦~~轮询机制~
启动,两个服务: