- 创建eureka服务端,服务提供端 ,消费端(服务提供端 和消费端都是eureka的 客户端)
1.1创建三个springboot工程项目,分别是server(服务端 )、provider(服务提供者)、consumer(消费者)(不会的百度)
1.2 引入一下pom.xml文件(以下文件包含了服务端和客户端,根据需求删除相关依赖,不删除也可以)
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>spring-cloud-order-service-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-cloud-order-service-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<!—springcloud版本 -->
<spring-cloud.version>Hoxton.SR11</spring-cloud.version>
</properties>
<dependencies>
<!—springboot web项目依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--springcloud eureka 客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--springcloud eureka服务端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!—springboot依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<!—Lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.3修改yml文件(新建的springboot项目没有把application文件后缀名改成yml就可以)
1.3.1server端yml(为了方便测试配置了两个profiles 。端口不一样名称不一样,两个服务端互相注册。 实际项目中可以配置多个yml文件启动 )
spring:
application:
name: spring-cloud-eureka-server
---
spring:
profiles: s1
eureka:
instance:
hostname: EurekaServerA
client:
service-url:
defaultZone: http:// EurekaServerB:9091/eureka
register-with-eureka: true
fetch-registry: true
server:
port: 9090
---
spring:
profiles: s2
eureka:
instance:
hostname: EurekaServerB
client:
service-url:
defaultZone: http:// EurekaServerA:9090/eureka
register-with-eureka: true
fetch-registry: true
server:
port: 9091
1.3.2 provider的yml文件
spring:
application:
name: provider
---
server:
port: 7070
eureka:
client:
service-url:
defaultZone: http://EurekaServerA:9090/eureka,http://EurekaServerB:9091/eureka
fetch-registry: true
register-with-eureka: true
instance:
prefer-ip-address: true
spring:
profiles: p1
---
server:
port: 7071
eureka:
client:
service-url:
defaultZone: http://EurekaServerA:9090/eureka,http://EurekaServerB:9091/eureka
fetch-registry: true
register-with-eureka: true
instance:
prefer-ip-address: true
spring:
profiles: p2
---
server:
port: 7072
eureka:
client:
service-url:
defaultZone: http://EurekaServerA:9090/eureka,http://EurekaServerB:9091/eureka
fetch-registry: true
register-with-eureka: true
instance:
prefer-ip-address: true
spring:
profiles: p3
1.3.2 consumer的yml
server:
port: 8080
spring:
application:
name: consumer
eureka:
client:
service-url:
defaultZone: http://EurekaServerA:9090/eureka,http://EurekaServerB:9091/eureka
register-with-eureka: true
fetch-registry: true
instance:
prefer-ip-address: true
#这个是配置ribbon的负载均衡策略(在spring cloud 2000版本中好像不起作用)
provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
好了到此为止项目基本是搭建完成了,启动各个服务,在浏览器中查看eureka的服务端,出现下图的内容就表示成功了
2编写代码验证
2.1 server服务端不用编写任何东西
2.2 provider服务提供者编写实际的业务(以下简单写个业务方便测试)
2.2.1 编写一个controller
@RestController
@RequestMapping("/order/data")
public class OrderStatisticServiceController {
@Autowired
private DiscoveryClient discoveryClient;
@Value("${server.port}")
private Integer port;
/**
* 根据用户id获取今日完单数
*
* @return 完单数
*/
@GetMapping("/getTodayFinishOrderNum/{id}")
public String getTodayFinishOrderNum(@PathVariable("id") String id){
Random random = new Random();
return "端口:"+port+" 序号:" +random.nextInt();
}
@RequestMapping("/hello")
public String hello(String name){
return "端口:"+port+ " hello " + name;
}
@RequestMapping("/user")
public String hello(@RequestBody User user){
return "端口:"+port+ " name: " + user.getName()+" age:"+user.getAge();
}
}
2.2.2 在启动类Application上加入@SpringBootApplication @EnableEurekaClient两个注解
2.3 编写consumer 类
2.3.1 编写controller
@RestController
@RequestMapping("/user/data")
public class UserCenterController {
@Autowired
private RestTemplate restTemplate;
@Autowired
private userService service;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/getTodayStatistic/{id}")
public void getTodayStatistic(@PathVariable("id") String id){
/**
* provider是服务提供这的名字是(实际项目更具需求更改 )
* order/data/getTodayFinishOrderNum/ 是调用用服务端方法的路径
这个是通过RestTemplate方式进行调用服务提供者的方法
在启动了中要加入
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
* for循环是为了验证在配置文件中配置的ribbon负载均衡策略 默认是轮询策略,配置文件中改为了随机
* 注意:ribbon的负载均衡策略在springboot 2.4.x版本中配置好像不起作用。本版本使用的是2.3.x版本
*/
for (int i = 0;i<=100;i++){
String forObject = restTemplate.getForObject("http://provider/order/data/getTodayFinishOrderNum/"+id, String.class);
System.out.println(forObject);
}
}
@RequestMapping(value = "/hello")
public String hello(String name){
String hello = service.hello(name);
return hello;
}
@RequestMapping(value = "/user")
public String hello(User user){
user.setName("cwn");
user.setAge("18");
String user1 = service.user(user);
return user1;
}
}
2.3.2 编写调用服务提供者的接口
注意:下面主要是通过feign方式调用服务提供者 需要在类上加入@FeignClient标签
@FeignClient(name = "provider")
public interface userService {
//地址为服务提供者对外暴露的地址
@RequestMapping(value = "/order/data/getTodayFinishOrderNum/{id}")
public String fegin(@PathVariable("id") String id);
/**
* 使用feign方式调用服务端
* 只需要在接口类上加上@FeignClient(name = "provider") name是服务端的名称
* 注意这个注解只能加在类上。
* @param name
* @return
*/
@RequestMapping(value = "/order/data/hello", method = RequestMethod.GET)
String hello(@RequestParam("name") String name);
/**
* 使用feign方式调用服务端
* 传递对象作为参数
* 接口类上加上@FeignClient(name = "provider") name是服务端的名称
* 注意:使用对象作为参数是要在接口类方法中的参数签加上@RequestBody注解。服务端也要加上@RequestBody注解
* 总之一句话在调用服务端的方法时,最直接的办法就是把服务端的方法直接复制到消费端的service接口类中这样就不会出错了
* @param user
* @return
*/
@RequestMapping(value = "/order/data/user")
String user(@RequestBody User user);
}
好了到此测试方法也都写完了,启动服务,在浏览器调用消费者暴露的 接口方法看看测试效果
完整项目和文档地址: https://download.csdn.net/download/u013774699/18236698
|