Spring Cloud,我也是第一次学习,今天我就讲下我的学习经历,如果哪里有不对的欢迎大家指出,共同学习。
第一步,搭建Eureka服务
Spirng官网有可以直接生成基础Maven项目,我们打开生成地址,然后将Maven项目导入Eclipse。
导入之后,我们就开始先搭建EurekaServer服务,首先,我们将需要的依赖加入进去,如下:
<?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.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 必须依赖包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</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>
项目结构如下:
然后,我们将application.properties配置文件打开,加入以下配置:
server.port=8080
eureka.instance.hostname=127.0.0.1
# 是否向服务中心注册自己
eureka.client.register-with-eureka=true
# 是否检索服务
eureka.client.fetch-registry=false
# 服务注册中心的配置内容,指定服务注册中心的位置
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
这个就是基础的配置,那么我们接下来启动项目,在启动类上加上一个注解@EnableEurekaServer,代表这是服务端:
@EnableEurekaServer
@SpringBootApplication
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
}
看到以下日志,说明启动成功,如下:
2019-10-14 09:36:23.016 INFO 14696 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$8745d6fb] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.9.RELEASE)
2019-10-14 09:36:23.673 INFO 14696 --- [ main] com.example.server.ServerApplication : No active profile set, falling back to default profiles: default
2019-10-14 09:36:24.144 WARN 14696 --- [ main] o.s.boot.actuate.endpoint.EndpointId : Endpoint ID 'service-registry' contains invalid characters, please migrate to a valid format.
2019-10-14 09:36:24.304 INFO 14696 --- [ main] o.s.cloud.context.scope.GenericScope : BeanFactory id=171be810-1c3e-3294-aa67-98a57fd7eb8c
2019-10-14 09:36:24.381 INFO 14696 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$8745d6fb] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-10-14 09:36:24.597 INFO 14696 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2019-10-14 09:36:24.615 INFO 14696 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2019-10-14 09:36:24.615 INFO 14696 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.26]
2019-10-14 09:36:24.736 INFO 14696 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2019-10-14 09:36:24.736 INFO 14696 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1053 ms
2019-10-14 09:36:24.816 WARN 14696 --- [ main] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources.
2019-10-14 09:36:24.816 INFO 14696 --- [ main] c.n.c.sources.URLConfigurationSource : To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
2019-10-14 09:36:24.825 INFO 14696 --- [ main] c.netflix.config.DynamicPropertyFactory : DynamicPropertyFactory is initialized with configuration sources: com.netflix.config.ConcurrentCompositeConfiguration@1cc8416a
2019-10-14 09:36:25.842 INFO 14696 --- [ main] c.s.j.s.i.a.WebApplicationImpl : Initiating Jersey application, version 'Jersey: 1.19.1 03/11/2016 02:08 PM'
2019-10-14 09:36:25.898 INFO 14696 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using JSON encoding codec LegacyJacksonJson
2019-10-14 09:36:25.899 INFO 14696 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using JSON decoding codec LegacyJacksonJson
2019-10-14 09:36:25.990 INFO 14696 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using XML encoding codec XStreamXml
2019-10-14 09:36:25.990 INFO 14696 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using XML decoding codec XStreamXml
2019-10-14 09:36:26.260 WARN 14696 --- [ main] o.s.c.n.a.ArchaiusAutoConfiguration : No spring.application.name found, defaulting to 'application'
2019-10-14 09:36:26.261 WARN 14696 --- [ main] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources.
2019-10-14 09:36:26.261 INFO 14696 --- [ main] c.n.c.sources.URLConfigurationSource : To enable URLs as dynamic configuration sources, define System property archaius.configurationSource.additionalUrls or make config.properties available on classpath.
2019-10-14 09:36:26.380 INFO 14696 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2019-10-14 09:36:27.292 INFO 14696 --- [ main] o.s.c.n.eureka.InstanceInfoFactory : Setting initial instance status as: STARTING
2019-10-14 09:36:27.319 INFO 14696 --- [ main] com.netflix.discovery.DiscoveryClient : Initializing Eureka in region us-east-1
2019-10-14 09:36:27.802 INFO 14696 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using JSON encoding codec LegacyJacksonJson
2019-10-14 09:36:27.802 INFO 14696 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using JSON decoding codec LegacyJacksonJson
2019-10-14 09:36:27.802 INFO 14696 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using XML encoding codec XStreamXml
2019-10-14 09:36:27.802 INFO 14696 --- [ main] c.n.d.provider.DiscoveryJerseyProvider : Using XML decoding codec XStreamXml
2019-10-14 09:36:27.923 INFO 14696 --- [ main] c.n.d.s.r.aws.ConfigClusterResolver : Resolving eureka endpoints via configuration
2019-10-14 09:36:28.237 INFO 14696 --- [ main] com.netflix.discovery.DiscoveryClient : Starting heartbeat executor: renew interval is: 30
2019-10-14 09:36:28.239 INFO 14696 --- [ main] c.n.discovery.InstanceInfoReplicator : InstanceInfoReplicator onDemand update allowed rate per min is 4
2019-10-14 09:36:28.242 INFO 14696 --- [ main] com.netflix.discovery.DiscoveryClient : Discovery Client initialized at timestamp 1571016988241 with initial instances count: 0
2019-10-14 09:36:28.267 INFO 14696 --- [ main] c.n.eureka.DefaultEurekaServerContext : Initializing ...
2019-10-14 09:36:28.268 WARN 14696 --- [ main] c.n.eureka.cluster.PeerEurekaNodes : The replica size seems to be empty. Check the route 53 DNS Registry
2019-10-14 09:36:28.274 INFO 14696 --- [ main] c.n.e.registry.AbstractInstanceRegistry : Finished initializing remote region registries. All known remote regions: []
2019-10-14 09:36:28.275 INFO 14696 --- [ main] c.n.eureka.DefaultEurekaServerContext : Initialized
2019-10-14 09:36:28.282 INFO 14696 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator'
2019-10-14 09:36:28.352 INFO 14696 --- [ main] o.s.c.n.e.s.EurekaServiceRegistry : Registering application UNKNOWN with eureka with status UP
2019-10-14 09:36:28.353 INFO 14696 --- [ main] com.netflix.discovery.DiscoveryClient : Saw local status change event StatusChangeEvent [timestamp=1571016988353, current=UP, previous=STARTING]
2019-10-14 09:36:28.355 INFO 14696 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/gq-asus:8080: registering service...
2019-10-14 09:36:28.357 INFO 14696 --- [ Thread-12] o.s.c.n.e.server.EurekaServerBootstrap : Setting the eureka configuration..
2019-10-14 09:36:28.358 INFO 14696 --- [ Thread-12] o.s.c.n.e.server.EurekaServerBootstrap : Eureka data center value eureka.datacenter is not set, defaulting to default
2019-10-14 09:36:28.359 INFO 14696 --- [ Thread-12] o.s.c.n.e.server.EurekaServerBootstrap : Eureka environment value eureka.environment is not set, defaulting to test
2019-10-14 09:36:28.379 INFO 14696 --- [ Thread-12] o.s.c.n.e.server.EurekaServerBootstrap : isAws returned false
2019-10-14 09:36:28.380 INFO 14696 --- [ Thread-12] o.s.c.n.e.server.EurekaServerBootstrap : Initialized server context
2019-10-14 09:36:28.401 INFO 14696 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2019-10-14 09:36:28.402 INFO 14696 --- [ main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8080
2019-10-14 09:36:28.404 INFO 14696 --- [ main] com.example.server.ServerApplication : Started ServerApplication in 6.434 seconds (JVM running for 7.481)
2019-10-14 09:36:28.515 INFO 14696 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-10-14 09:36:28.515 INFO 14696 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2019-10-14 09:36:28.520 INFO 14696 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 5 ms
2019-10-14 09:36:28.580 INFO 14696 --- [nio-8080-exec-1] c.n.e.registry.AbstractInstanceRegistry : Registered instance UNKNOWN/gq-asus:8080 with status UP (replication=false)
2019-10-14 09:36:28.594 INFO 14696 --- [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_UNKNOWN/gq-asus:8080 - registration status: 204
那么我们来访问下,启动端口可以随意改动,因为每个电脑的开放端口都不一样,所以大家可以根据自己的需要进行手动修改,我的端口是8080,访问地址就会http://localhost:8080/ ,注意后面没有项目名称,因为我们没有部署任何项目,所以不用项目直接就是ip+端口即可,那么我们看下访问效果是什么样子?
截图上大家可以看到有个 Instance currently registered with Eureka ,意思就是Eureka实例,就是我们的本地,大家可能没有注意到我们有个配置,就是在application.properties配置文件中,有个配置就是“是否向服务中心注册自己”,如果改成“true”,那么我就可以看到图上的实例,如果改成“false”,那么我们就不会看到图中的实例。
第二步 服务提供者-provider-A
首先,建立Maven工程,名字为provider-A,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>spring</groupId>
<artifactId>cloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>provider-A</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
项目结构如下:
接下来建立控制层,编写一个基础的Controller,如下:
package spring.cloud.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@GetMapping("/user/{name}")
public Map<String,Object> getUser(@PathVariable("name") String userName) {
Map<String,Object> data = new HashMap<String,Object>();
data.put("id",userName);
data.put("from","provider-A");
return data;
}
}
application.properties配置比较关键,启动端口记得修改,如下:
# 注册中心的注册地址
eureka.client.service-url.defaultZone=http://127.0.0.1:8080/eureka/
# 服务名称--调用的时候根据名称来调用该服务的方法
spring.application.name=service-provider-A
server.port=8081
启动类上加上@EnableEurekaClient,代表这是客户端,如下:
package spring.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@EnableEurekaClient
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
服务提供者A就写好了,那么我们来启动下,看下在Eureka的面板中是否有该服务,注意,这里项目启动需要先启动Server,然后再启动provider,因为服务提供者他需要向服务注册中心注册自己的服务。
待两个项目启动后,我们接下来看下Eureka面板,如下:
我们从图上可以看到,SERVICE-PROVIDER-A,状态UP、端口,那么我们接下来调用一个服务启动者provider-A我们刚才写好的UserController,如下:
我们可以看到,调用成功后返回的Map结果集。
Eureka服务注册中心,同一个服务名称,如果有多个实例,会以“负载均衡”的模式来处理请求。
那么我们就再搭建一个provider-B,我们来实践下。
第三步 搭建服务提供者provider-B
首先,我们新建Mavne项目,名字可以用provider-B,其实依赖和Provider-A的依赖是一样的,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>spring</groupId>
<artifactId>provider-B</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>provider-B</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
项目结构,如下:
新建Controller包,新建UserController类,代码如下:
package spring.provider_B.contrller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@GetMapping("/user/{name}")
public Map<String,Object> getUser(@PathVariable("name") String userName) {
Map<String,Object> data = new HashMap<String,Object>();
data.put("id",userName);
data.put("from","provider-B");
return data;
}
}
application.properties,注意这里的名称和provider-A是一样的,注意启动端口不能一样,配置如下:
# 注册中心的注册地址
eureka.client.service-url.defaultZone=http://127.0.0.1:8080/eureka/
# 服务名称--调用的时候根据名称来调用该服务的方法
spring.application.name=service-provider-A
server.port=8082
启动类,加上@EnableEurekaClient注解,如下:
@EnableEurekaClient
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
服务提供者provider-B也搭建完毕,那么我们来启动下这3个项目,注意启动顺序,只要注册中心先启动就可以,服务提供者哪个在前都可以,
现在同一个名称的服务提供者有2个,那么我们打开面板看下,是否是像我们说的那个样子,
我们可以看到SERVICE-PROVIDER-A,状态UP(2),后面的实例有两个,一个是8081,另外一个是8082
我们像调用Provider-A那样调用一下Provider-B一下,如下:
好,我们已经将2个服务提供者建立好了,那么我们接下来就需要建立消费者了。
第四步 建立消费者
首先,新建Maven项目,名称可以用client-A,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>spring</groupId>
<artifactId>client-A</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>client-A</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
项目结构如下:
application.properties,注意启动端口改下,不能和其他的项目冲突,配置如下:
# 注册中心的注册地址
eureka.client.service-url.defaultZone=http://127.0.0.1:8080/eureka/
# 服务名称--调用的时候根据名称来调用该服务的方法
spring.application.name=service-customer-A
server.port=8083
建立控制层controller,新建CustomerController,代码如下:
package spring.client_A.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class CustomerController {
@Autowired
private RestTemplateBuilder builder;
// 启动的时候要注意,由于我们在controller中注入了RestTemplate,所以启动的时候需要实例化该类的一个实例
@Autowired
private RestTemplate restTemplate;
// 使用RestTemplateBuilder来实例化RestTemplate对象,spring默认已经注入了RestTemplateBuilder实例
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return builder.build();
}
/**
* Rest服务端使用RestTemplate发起http请求,然后得到数据返回给前端
* @param username
* @return
*/
@SuppressWarnings("unchecked")
@GetMapping(value = "/gotoUser/{username}")
@ResponseBody
public Map<String, Object> getUser(@PathVariable("username") String username) {
Map<String, Object> data = new HashMap<String, Object>();
/**
* 地址是http://service-provider
* 而不是http://127.0.0.1:8082/
* 因为他向注册中心注册了服务,服务名称service-provider-A,我们访问service-provider-A即可
*/
data = restTemplate.getForObject("http://service-provider-A/user/" + username, Map.class);
return data;
}
}
在这里需要注意一下,我们调用服务的时候有一行代码,那就是根据服务名称调用,
data = restTemplate.getForObject("http://service-provider-A/user/" + username, Map.class);
上面调用的是SERVICE-PROVIDER-A,我们刚才建立了两个服务提供者都叫PROVIDER-A,那么接下来我们按照顺序启动一下,首先启动服务注册中心、服务提供者A|B、最后启动消费者。
调用消费者
我们已经将服务注册中心、消费者、服务提供者都建立好了,那么接下来我们来测试下,同一个服务名称的应对同一个请求的处理是什么样子的,如下:
然后再刷新一次,你们就会发现,它就会返回provider-b,因为之前已经有请求给了provider-A了,一直刷新的话,就会看到它俩会一直轮询。
因为搭建内容比较多,所以我把我搭建的项目上传上来,搭建可以下载下来后自己比着搭建一次,多搭建几次就熟悉了,我会及时更新,不断学习~