Eureka服务程序也叫注册中心,我们所说的服务提供者是通过注册中心向外部系统提供服务的程序,服务消费者是通过注册中心获取服务的程序。服务提供者与服务消费者都使用注解@EnableDiscoveryClient标识。前面例程中我们设计一个Eureka注册中心,下面我们设计一个用户服务提供者例程。服务提供根据用户ID查询用户对象,保存用户对象的功能
POM.xml文件
<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>
<!--
SpringCloud是基于SpringBoot框架的,必须引入SpringBoot的依赖
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<groupId>com.test</groupId>
<artifactId>eureka-userservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-userservice</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--
Spring Cloud的命名没有按照版本方式管理,是采用命名方式,
版本名称采用伦敦地铁站的名称命名,根据字母表的顺序对应版本时间顺序,
比如最早的Release版本号为Angel,第二个Release版本为Brixton
-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--
Eureka 服务依赖
-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<!--
根据SpringCloud约定打成可以独立执行Jar包,使用Maven命令
mvn package spring-boot:repackage
-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Application.properties
#服务端口
server.port=9100
#服务名称
spring.application.name=USER-SERVICE
#注册中心地址
eureka.client.service-url.defaultZone=http://chenqx:123@localhost:8110/eureka
#是否注册到注册中心
eureka.client.register-with-eureka=true
#获取服务清单时间间隔
eureka.client.registry-fetch-interval-seconds=10
#是否从服务器上获取服务清单
eureka.client.fetch-registry=true
App启动代码
package com.test.eureka_userservice;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class App
{
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
}
}
UserEndpoint服务
package com.test.eureka_userservice;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.netflix.appinfo.EurekaInstanceConfig;
@RestController
public class UserEndpoint {
protected Logger logger = LoggerFactory.getLogger(UserEndpoint.class);
private static List<UserInfo> users = new ArrayList<UserInfo>();
static{
users.add(new UserInfo("1","java","Java","pwd123","java@sun.com",Date.valueOf("1991-01-01")));
users.add(new UserInfo("2","oracle","Oracle","pwd123","java@sun.com",Date.valueOf("1980-01-01")));
users.add(new UserInfo("3","android","Android","pwd123","java@sun.com",Date.valueOf("2005-01-01")));
}
@Autowired
private EurekaInstanceConfig eurekaInstanceConfig;
@Value("${server.port}")
private int serverPort = 0;
@RequestMapping(value="/hi",method=RequestMethod.GET)
public String hi()
{
this.logger.info("/hi,instanceId:{},host:{}",
eurekaInstanceConfig.getInstanceId(),eurekaInstanceConfig.getSecurePort()
);
return "Hi,I'm ready at instance "+eurekaInstanceConfig.getInstanceId()+" port "+String.valueOf(serverPort);
}
@RequestMapping(value="/getUserById",method=RequestMethod.GET)
public UserInfo getUserById(String id)
{
this.logger.info("/getUserById,instanceId:{},host:{}",
eurekaInstanceConfig.getInstanceId(),eurekaInstanceConfig.getSecurePort()
);
for(UserInfo ui:users)
{
System.out.println("ui==="+ui.getId()+",name="+ui.getName());
if(ui.getId().equals(id))
return ui;
}
return null;
}
@RequestMapping(value="/saveUser",method=RequestMethod.POST)
public Boolean saveUser(@RequestBody UserInfo ui)
{
this.logger.info("/saveUser,instanceId:{},host:{}",
eurekaInstanceConfig.getInstanceId(),eurekaInstanceConfig.getSecurePort()
);
System.out.println(ui);
users.add(ui);
System.out.println(users);
return true;
}
}
UserInfo对象实体
package com.test.eureka_userservice;
import java.io.Serializable;
import java.sql.Date;
public class UserInfo implements Serializable{
private static final long serializeVersionUID = 10L;
private String id = null;
private String loginId = null;
private String name = null;
private String password = null;
private String email = null;
private Date birthday = null;
public UserInfo(){}
public UserInfo(String id,String loginId,String name,String password,
String email,Date birthday)
{
this.id = id;
this.loginId = loginId;
this.name = name;
this.password = password;
this.email = email;
this.birthday = birthday;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getLoginId() {
return loginId;
}
public void setLoginId(String loginId) {
this.loginId = loginId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
打包
启动用户服务
用户服务注册到注册中心
设计服务消费者
POM.xml
<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>
<!--
SpringCloud是基于SpringBoot框架的,必须引入SpringBoot的依赖
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<groupId>com.test</groupId>
<artifactId>eureka-userclient</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-userclient</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--
Spring Cloud的命名没有按照版本方式管理,是采用命名方式,
版本名称采用伦敦地铁站的名称命名,根据字母表的顺序对应版本时间顺序,
比如最早的Release版本号为Angel,第二个Release版本为Brixton
-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--
SpringBoot Web依赖
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<!--
根据SpringCloud约定打成可以独立执行Jar包,使用Maven命令
mvn package spring-boot:repackage
-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Application.properties
server.port=9101
spring.application.name=USER-WEB
eureka.client.service-url.defaultZone=http://chenqx:123@localhost:8110/eureka
eureka.client.register-with-eureka=true
eureka.instance.lease-renewal-interval-in-seconds=10
eureka.client.registry-fetch-interval-seconds=10
eureka.client.fetch-registry=true
定义用户实体类
package com.test.eureka_userclient;
import java.io.Serializable;
import java.sql.Date;
public class UserInfo implements Serializable{
private static final long serializeVersionUID = 10L;
private String id = null;
private String loginId = null;
private String name = null;
private String password = null;
private String email = null;
private Date birthday = null;
public UserInfo(){}
public UserInfo(String id,String loginId,String name,String password,
String email,Date birthday)
{
this.id = id;
this.loginId = loginId;
this.name = name;
this.password = password;
this.email = email;
this.birthday = birthday;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getLoginId() {
return loginId;
}
public void setLoginId(String loginId) {
this.loginId = loginId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
定义UserController
package com.test.eureka_userclient;
import java.sql.Date;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class UserController {
protected Logger logger = LoggerFactory.getLogger(UserController.class);
@Autowired
@Qualifier(value="restTemplate")
private RestTemplate restTemplate;
@RequestMapping(value="/hi",method=RequestMethod.GET)
public String hi()
{
return restTemplate.getForEntity("http://USER-SERVICE/hi", String.class).getBody();
}
@RequestMapping("/getUserById/{id}")
public UserInfo getUserById(@PathVariable("id") String id) {
ResponseEntity<UserInfo> responseEntity = restTemplate.getForEntity("http://USER-SERVICE/getUserById?id={1}", UserInfo.class, id);
return responseEntity.getBody();
}
@RequestMapping("/getUserById2/{id}")
public UserInfo getUserById2(@PathVariable("id") String id) {
Map<String, String> map = new HashMap<String, String>();
map.put("id", id);
ResponseEntity<UserInfo> responseEntity = restTemplate.getForEntity("http://USER-SERVICE/getUserById?id={id}", UserInfo.class, map);
return responseEntity.getBody();
}
@RequestMapping("/saveUser")
public Boolean saveUser() {
UserInfo ui = new UserInfo("4","c++","Borland","pwd123","java@sun.com",Date.valueOf("1991-01-01"));
ResponseEntity<Boolean> responseEntity = restTemplate.postForEntity("http://USER-SERVICE/saveUser",ui,Boolean.class);
return responseEntity.getBody();
}
}
定义启动类
package com.test.eureka_userclient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@EnableDiscoveryClient
@SpringBootApplication
public class App
{
@Bean
@LoadBalanced
RestTemplate restTemplate()
{
return new RestTemplate();
}
public static void main( String[] args )
{
SpringApplication.run(App.class, args);
}
}
打包测试