最近在读spring-cloud微服务实战,顺便跟着书中的例子敲了下代码。本篇文章主要介绍了eureka的三个核心角色:服务注册中心、服务提供者、服务消费者。

一.eureka服务注册中心
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.test.eureka</groupId>
	<artifactId>eureka</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
		<relativePath />
	</parent>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
			<version>1.4.2.RELEASE</version>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Dalston.SR5</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<finalName>configServer</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
	<!-- <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> 
		<artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> 
		<target>1.5</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> 
		<artifactId>maven-shade-plugin</artifactId> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> 
		</configuration> <executions> <execution> <phase>package</phase> <goals> 
		<goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
		<mainClass>com.test.eureka.Test</mainClass> </transformer> </transformers> 
		</configuration> </execution> </executions> </plugin> </plugins> </build> -->
</project>

主方法EurekaApp

@EnableEurekaServer
@SpringBootApplication
public class EurekaApp {

	public static void main(String[] args) {
		new SpringApplicationBuilder(EurekaApp.class).web(true).run(args);
	}
}

配置文件
1.application-peer1.properties

spring.application.name=eureka-server
server.port=9090
eureka.instance.hostname=peer1
eureka.client.serviceUrl.defaultZone=http://peer2:9091/eureka/

2.application-peer2.properties

spring.application.name=eureka-server
server.port=9091
eureka.instance.hostname=peer2
eureka.client.serviceUrl.defaultZone=http://peer1:9090/eureka/

3.主配置application.properties

spring.application.name=hello-service
eureka.client.serviceUrl.defaultZone=http://peer1:9090/eureka/,http://peer1:9091/eureka/

4.修改本地映射
C:\Windows\System32\drivers\etc\hosts

127.0.0.1  peer1
127.0.0.1  peer2

5.用maven打成jar,运行(peer1指定运行application-peer1.properties,peer运行application-peer2.properties)
启动时进入jar的路径下,开两个cmd,分别执行下面的命令,由于二者是互相注册,可能会报错,没关系,都启动后就可以了。

java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2

spring-cloud 之eureka
6.以上完成了服务注册中心集群的搭建,可以通过http://localhost:9090或者9091查看注册中心页面
spring-cloud 之eureka

二、hello-service服务发现
1.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.maven.test</groupId>
	<artifactId>hello-world</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>MavenTest</name>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
		<relativePath />
	</parent>
	<dependencies>
		<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.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
			<version>1.4.2.RELEASE</version>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Dalston.SR5</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<build>
		<finalName>configServer</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

2.EurekaProviderApplication主类

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaProviderApplication {
	public static void main(String[] args) {
		new SpringApplicationBuilder(EurekaProviderApplication.class).web(true).run(args);
	}
}

3.ProviderNode1Controller请求响应类

@RestController
public class ProviderNode1Controller {
	@Autowired
	private DiscoveryClient client;

	@RequestMapping(value = "/hello", method = RequestMethod.GET)
	public String index() {
		ServiceInstance in = client.getLocalServiceInstance();
		System.out.println("host:" + in.getHost() + ",port:" + in.getPort());
		return "hello world";
	}
}

4.application.properties

@RestController
public class ProviderNode1Controller {
	@Autowired
	private DiscoveryClient client;

	@RequestMapping(value = "/hello", method = RequestMethod.GET)
	public String index() {
		ServiceInstance in = client.getLocalServiceInstance();
		System.out.println("host:" + in.getHost() + ",port:" + in.getPort());
		return "hello world";
	}
}

5.打成jar运行两个服务

java -jar hello-world-0.0.1-SNAPSHOT.jar --server.port=8080
java -jar hello-world-0.0.1-SNAPSHOT.jar --server.port=8081

三、ribbon-consumer消费程序
1.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/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.ribbon.test</groupId>
	<artifactId>ribbon-consumer</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>Archetype - ribbon-consumer</name>
	<url>http://maven.apache.org</url>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
		<relativePath />
	</parent>
	<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>
			<version>1.4.2.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-ribbon</artifactId>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Dalston.SR5</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<build>
		<finalName>configServer</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

2.消费主类

@EnableDiscoveryClient
@SpringBootApplication
public class ConsumerApplaction {

	@Bean
	@LoadBalanced
	RestTemplate restTemplate() {
		return new RestTemplate();
	}

	public static void main(String[] args) {
		SpringApplication.run(ConsumerApplaction.class, args);
	}
}

3.消费请求类

@RestController
public class ConsumerController {
	@Autowired
	RestTemplate restTemplate;

	@RequestMapping(value = "/consumer", method = RequestMethod.GET)
	public String consumer() {
		String r = restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody();
		System.out.println("r====" + r);
		return r;
	}
}

注意:
http://HELLO-SERVICE/hello中HELLO-SERVICE为注册中心的服务名
4.application.properties

spring.application.name=ribbon-consumer
server.port=9003
eureka.client.serviceUrl.defaultZone=http://localhost:9090/eureka/

5.运行程序

java -jar ribbon-consumer-0.0.1-SNAPSHOT.jar

6.浏览器访问
http://localhost:9003/consumer
spring-cloud 之eureka
spring-cloud 之eureka
从运行结果可以看到消费端通过注册中心成功调用服务提供者的接口。
总结:
在完成例子情况下遇到了如下问题:
1.把包打成可运行jar,传统maven使用的是

<transformers> 
	<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
		<mainClass>com.test.eureka.Test</mainClass> 
	</transformer>
 </transformers> 

而这种方式打包一直报错,查找资料发现使用如下方法是可以成功的。

<build>
		<finalName>configServer</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

2.纠结eureka服务注册中心中三个配置文件的关系
application-peer1.properties、application-peer2.properties、application.properties 当执行``java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1时是否会执行application-peer1.properties?
3.消费服务中的请求url问题
HELLO-SERVICE应该为注册中心Application列中的服务名

String r = restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody();

spring-cloud 之eureka

例子参考:spring-cloud微服务实战

相关文章: