搭建SpringCloud的EurekaServer、服务提供者、消费者

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了,一直刷新的话,就会看到它俩会一直轮询。

因为搭建内容比较多,所以我把我搭建的项目上传上来,搭建可以下载下来后自己比着搭建一次,多搭建几次就熟悉了,我会及时更新,不断学习~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟特工007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值