这个小demo只是自学的时候想简单练习一下 因此不包含mybatis,数据查询是写死的 只是大概测试一下eureka
一、服务端
1、导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
2、springboot启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
// 启用EurekaServer
@EnableEurekaServer
public class EurekaApp {
public static void main(String[] args) {
SpringApplication.run(EurekaApp.class,args);
}
}
3、配置文件
# eureka 配置
# eureka 一共有4部分 配置
# 1. dashboard:eureka的web控制台配置
# 2. server:eureka的服务端配置
# 3. client:eureka的客户端配置
# 4. instance:eureka的实例配置
server:
port: 8761 #默认8761端口
eureka:
instance:
hostname: localhost # 主机名
prefer-ip-address: true #是否将ip注册到eureka中 默认false
ip-address: 127.0.0.1
client:
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
register-with-eureka: false # 是否将自己的路径 注册到eureka上。eureka server 不需要的,eureka provider client 需要
fetch-registry: false # 是否需要从eureka中抓取路径。eureka server 不需要的,eureka consumer client 需要
server:
renewal-percent-threshold:0.5 #阈值百分比 默认0.85
renewal-threshold-update-interval-ms:30000 #Eureka服务器控制台刷新的阈值
enable-self-preservation: false #关闭自我保护机制
eviction-interval-timer-in-ms: 3000 #清理间隔
spring:
application:
name:eureka-server #服务应用名称
二、客户端
因为在springcloud中所有微服务模块都可能是生产者和消费者 因此 我这里简单的定义了两个小模块 一个是生产者、一个是消费者 在真实生产环境中 没有严格意义上的生产者与消费者的区别
提供者
1、导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class,args);
}
}
3、提供者controller
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/goods")
public class GoodsController {
@Autowired
private GoodsService goodsService;
@GetMapping("/findOne/{id}")
public Goods findOne(@PathVariable("id") int id){
Goods goods = goodsService.findOne(id);
// System.out.println("goods2 = " + goods);
return goods;
}
}
4、配置文件
server:
port: 8000
eureka:
instance:
hostname: localhost # 主机名
prefer-ip-address: true
ip-address: 127.0.0.1
instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port} # 设置web控制台显示的 实例id
lease-renewal-interval-in-seconds: 3 # 每隔3 秒发一次心跳包
lease-expiration-duration-in-seconds: 9 # 如果9秒没有发心跳包,服务器呀,你把我干掉吧~
client:
service-url:
defaultZone: http://localhost:8761/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
# defaultZone: http://eureka-server1:8761/eureka,http://eureka-server2:8762/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
spring:
application:
name: eureka-provider # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径
消费者
1、导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2、启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class,args);
}
}
因为在服务调用的时候需要在Java代码中访问 restful 服务 我使用的时RestTemplate来完成远程调用
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。其功能与 HttpClient 类似,但是 RestTemplate 实现更优雅,使用更方便
3、RestTemplate 注入
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@LoadBalanced//调用负载均衡
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
4、消费者controller
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.context.annotation.Import;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/goods/{id}")
public Goods findGoodsById(@PathVariable("id") int id) {
System.out.println("findGoodsById..." + id);
List<ServiceInstance> instances = discoveryClient.getInstances("eureka-provider");
if (instances == null || instances.size() == 0) {
return null;
}
ServiceInstance serviceInstance = instances.get(0);
String host = serviceInstance.getHost();
System.out.println("host = " + host);
int port = serviceInstance.getPort();
// String url = "http://localhost:8000/goods/findOne/";
String url = "http://"+host+":"+port+"/goods/findOne/";
//远程调用Goods服务中的findOne接口
Goods goods = restTemplate.getForObject( url+ id, Goods.class);
return goods;
}
@GetMapping("/goods2/{id}")
public Goods findGoodsById2(@PathVariable("id") int id) {
System.out.println("findGoodsById..." + id);
String url = "http://eureka-provider/goods/findOne/";
Goods goods = restTemplate.getForObject( url + id, Goods.class);
//远程调用Goods服务中的findOne接口
return goods;
}
}
5、配置文件
server:
port: 9000
eureka:
instance:
hostname: localhost # 主机名
prefer-ip-address: true
ip-address: 127.0.0.1
instance-id: ${eureka.instance.ip-address}:${spring.application.name}:${server.port} # 设置web控制台显示的 实例id
lease-renewal-interval-in-seconds: 3 # 每隔3 秒发一次心跳包
lease-expiration-duration-in-seconds: 9 # 如果9秒没有发心跳包,服务器呀,你把我干掉吧~
client:
service-url:
defaultZone: http://localhost:8761/eureka # eureka服务端地址,将来客户端使用该地址和eureka进行通信
registry-fetch-interval-seconds: 10 #获取服务地址列表间隔时间 默认30秒
spring:
application:
name: eureka-consumer # 设置当前应用的名称。将来会在eureka中Application显示。将来需要使用该名称来获取路径
仅仅留下一部分代码 导包也未全部粘贴进入 仅留予自己忘记时有个参考