Eureka
这篇就是简单的记载最简单、基础的Eureka的配置。
- 搭建注册中心
- 引入依赖spring-cloud-starter-netflix-eureka-server
- 配置EurekaServer
- 通过@EnableEurekaServer 激活Eureka Server端配置-
- 服务注册
- 服务提供者引入spring-cloud-starter-netflix-eureka-client 依赖
- 通过eureka.client.serviceUrl.defaultZone 配置注册中心地址
eureka注册中心
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
服务端(服务消费者 或 服务生产者)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
一、eureka注册中心
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
application.yml
server:
port: 9000
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false #不在eureka注册自己
fetch-registry: false #不从eureka获取注册信息
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
EurekaServerApplication.java
package xyz.gsdn.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
打开浏览器访问http://localhost:9000即可进入EurekaServer内置的管理控制台
二、服务注册到Eureka注册中心
用来被调用,即服务提供者
application.yml
server:
port: 9001
servlet:
context-path: /
spring:
application:
name: service-product
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: root
jpa:
database: MySQL
show-sql: true
open-in-view: true
eureka:
client:
serviceUrl: # eureka server的路径
defaultZone: http://localhost:9000/eureka/
instance:
prefer-ip-address: true #使用ip注册
Controller
@RestController
@RequestMapping("/product")
public class ProductController {
@Autowired
ProductService productService;
@RequestMapping(value = "/{id}",method = RequestMethod.GET)
public Product findById(@PathVariable(value = "id") Long id)
{
//通过数据库查询product
Product product = productService.findById(id);
System.out.println(product);
return product;
}
}
通过http://localhost:9001/product/1 可访问product服务
用来调用product服务,即服务消费者
pom.xml和product的pom相同
application.xml
server:
port: 9002
servlet:
context-path: /
spring:
application:
name: service-order
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: root
jpa:
database: MySQL
show-sql: true
open-in-view: true
eureka:
client:
serviceUrl: # eureka server的路径
defaultZone: http://localhost:9000/eureka/
instance:
prefer-ip-address: true #使用ip注册
OrderApplication.java
package xyz.gsdn.order;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
//new RestTemplate,将RestTemplate加入到spring容器
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
Controller
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
DiscoveryClient discoveryClient;
@Autowired
RestTemplate restTemplate;
//这是不经过eureka,直接使用ip+端口号进行访问服务
/* @RequestMapping(value = "/buy/{id}",method = RequestMethod.GET)
public Product findById(@PathVariable(value = "id") Long id)
{
Product product = restTemplate.getForObject("http://localhost:9004/product/"+id, Product.class);
System.out.println(product);
return product;
}*/
@RequestMapping(value = "/buy/{id}",method = RequestMethod.GET)
public Product findById(@PathVariable(value = "id") Long id)
{
//discoveryClient获取service-product服务
List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
// for (ServiceInstance instance : instances) {
// System.out.println(instance);
//}
//获取service-product服务的第一个服务,因为eureka完全可以有多个同名服务,然后应该通过ribbon进行负载均衡自动调取服务
ServiceInstance serviceInstance = instances.get(0);
//获取服务ip地址
String host = serviceInstance.getHost();
//获取端口号
int port = serviceInstance.getPort();
String url = "http://"+host+":"+port+"/product/"+id;
System.out.println(url);
//通过restTemplate进行访问服务
Product product = restTemplate.getForObject(url, Product.class);
System.out.println(product);
return product;
}
}
通过http://localhost:9002/order/buy/1 即可访问该方法
该方法通过从eureka注册中心中根据服务名获取服务信息,然后根据服务信息调用restTemplate进行访问product_service中方法
项目地址1:https://shen-i.lanzous.com/iNXEMk7l75a
项目地址2:https://gitee.com/hxmkd/spring-cloud/tree/master/study_springcloud1-eureka/