Eureka服务的三个角色
- 服务注册中心
- Eureka 提供的服务端, 提供服务注册与发现的功能, 一般被称作eureka-server
- 服务提供者
- 提供服务的应用, 可以是Spring Boot 应用, 也可以是其他技术平台且遵循Eureka 通信机制的应用。它将自己提供的服务注册到Eureka, 以供其他应用发现
- 服务消费者
- 消费者应用从服务注册中心获取服务列表, 从而使消费者可以知道去何处调用其所需要的服务
注册中心
项目创建
创建 module
cloud-eureka-server7001
cloud-eureka-server7002
cloud-eureka-server7003
依赖
分别导入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置文件
7001
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
7002
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名称
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/
7003
server:
port: 7003
eureka:
instance:
hostname: eureka7003.com #eureka服务端的实例名称
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7001.com/7001/eureka/
启动类
都一样,加上 @EnableEurekaServer 注解即可
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(EurekaMain7001.class,args);
}
}
服务提供者
项目创建
创建module
cloud-provider-payment8001
cloud-provider-payment8002
两个项目除了项目名和端口不一样,其他都一样
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>com.qc.springcloud</groupId>
<artifactId>cloud-provider-payment8001</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.qc.springcloud</groupId>
<artifactId>cloud-commons</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
配置文件
server:
port: 8001
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/sl?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
username: root
password: 123456
application:
name: cloud-payment-service
mybatis-plus:
mapper-locations: classpath:/mapper/*Mapper.xml
type-aliases-package: com.qc.springcloud.pojo
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
instance:
#信息
instance-id: payment8001
controller
package com.qc.springcloud.controller;
import com.qc.springcloud.entity.Payment;
import com.qc.springcloud.service.PaymentService;
import com.qc.springcloud.vo.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* @author c
* @create: 2021-04-21 18:14
*/
@RestController
@Slf4j
public class PaymentController {
@Resource
public PaymentService paymentService;
@Value("${server.port}")
private String port;
/**
* 服务发现
*/
@Resource
private DiscoveryClient discoveryClient;
@PostMapping("/addPayment")
public CommonResult addPayment(Payment payment){
boolean save = paymentService.save(payment);
if (save){return new CommonResult(200,"新增成功 : "+port,null);}
return new CommonResult(503,"新增错误",null);
}
@PostMapping("/deletePayment/{pId}")
public CommonResult deletePayment(@PathVariable long pId){
boolean b = paymentService.removeById(pId);
if (b){return new CommonResult(200,"删除成功 : "+port,null);}
return new CommonResult(506,"删除异常",null);
}
@PostMapping("/updatePayment")
public CommonResult updatePayment(Payment payment){
boolean b = paymentService.updateById(payment);
if (b){return new CommonResult(200,"更新成功 : "+port,null);}
return new CommonResult(504,"更新异常异常",null);
}
@RequestMapping("/paymentById/{pId}")
public CommonResult paymentById(@PathVariable long pId){
log.info("pId={}",pId);
Payment payment = paymentService.getById(pId);
return new CommonResult(200,"查询成功 : "+port,payment);
}
@RequestMapping("/paymentList")
public CommonResult paymentList(){
List<Payment> paymentList = paymentService.list();
return new CommonResult(200,"查询成功 : "+port,paymentList);
}
/**
* 提供服务发现接口
*/
@GetMapping("/payment/discovery")
public Object discovery(){
List<String> services = discoveryClient.getServices();
services.forEach(s -> log.info("***element:"+s));
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
instances.forEach(serviceInstance -> log.info(serviceInstance.getInstanceId()
+"\t"+serviceInstance.getHost()+"\t"+serviceInstance.getPort()+"\t"+serviceInstance.getUri()));
return this.discoveryClient;
}
}
启动类
@SpringBootApplication
@MapperScan("com.qc.springcloud.mapper")
@EnableTransactionManagement
@EnableEurekaClient
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class,args);
}
}
服务消费者
创建module
cloud-consumer-order80
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!-- 自己写的公共包 -->
<dependency>
<groupId>com.qc.springcloud</groupId>
<artifactId>cloud-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
配置文件
server:
port: 80
spring:
application:
name: cloud-order-service
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka.http://eureka7003.com:7003/eureka
config
@Configuration
public class ApplicationContextConfig {
/**
*使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
*/
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
controller
消费者没有mapper和service
使用RestTemplate 调用服务服务提供者的借口
@RestController
public class OrderController {
// private static final String REST_PREFIX = "http://localhost:8001";
private static final String REST_PREFIX = "http://CLOUD-PAYMENT-SERVICE";
@Resource
private RestTemplate restTemplate;
@PostMapping("/consumer/payment/addPayment")
public CommonResult<Payment> addPayment(Payment payment){
return restTemplate.postForObject(REST_PREFIX+"/addPayment",payment,CommonResult.class);
}
@PostMapping("/consumer/payment/deletePayment/{pId}")
public CommonResult deletePayment(@PathVariable long pId){
return restTemplate.postForObject(REST_PREFIX+"/deletePayment",pId,CommonResult.class);
}
@PostMapping("/consumer/payment/updatePayment")
public CommonResult updatePayment(Payment payment){
return restTemplate.postForObject(REST_PREFIX+"/deletePayment",payment,CommonResult.class);
}
@RequestMapping("/consumer/payment/paymentById/{pId}")
public CommonResult paymentById(@PathVariable long pId){
return restTemplate.postForObject(REST_PREFIX+"/paymentById",pId,CommonResult.class);
}
@RequestMapping("/consumer/payment/paymentList")
public CommonResult paymentList(){
return restTemplate.postForObject(REST_PREFIX+"/paymentList",null,CommonResult.class);
}
}