最最最基础的服务搭建,实现目的是可以注册,可以消费;没有原理,没有知识拓展。项目名称写错了,应该是Eureka,
首先先创建一个maven项目,项目是多模块结构。
在erukademo的pom里引入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
正常用idea创建的model会在erukademo的pom里自动加上modules,如下,
<modules>
<module>server</module>
<module>consumer</module>
<module>producer</module>
<module>producer1</module>
</modules>
没有则自己添加一下,每个子模块的pom里会自动引入父模块(erukademo)
没有的话自己加一下。项目结构构件完毕后,先创建一个eureka注册服务。
创建eureka注册服务。server
1.添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
再写个启动类
@SpringBootApplication
@EnableEurekaServer
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class);
System.out.println("启动成功");
}
}
再加一个application.yaml配置文件
server:
port: 9020
eureka:
client:
fetchRegistry: false ## 要不要去注册中心获取其他服务的地址
registerWithEureka: false ## 表示自己就是注册中心,不用注册自己
serviceUrl:
defaultZone: http://localhost:9020
spring:
application:
name: eruka-demo-server1
直接启动服务就可以了,如果启动不了,先clean,再packge一下,点下面这里。
注意后面带root的那一个,如果启动不了就重复这个操作,启动报错另说。
启动之后,在浏览器器访问 http:localhost:9020/就可以打开eureka控制台了。
还没有注册的服务。下面开始编写生产者,注册到eureka。
编写eureka生产者 producer
添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
写一个启动类
@SpringBootApplication
@EnableDiscoveryClient
public class ProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ProducerApplication.class);
System.out.println("启动成功");
}
}
再写一个要注册的方法
@RestController
public class Producer1 {
@GetMapping("/get")
public String get(){
return "producer1";
}
}
添加一个application.yaml配置,如下
server:
port: 9021
spring:
application:
name: eruka-producer1
eureka:
client:
serviceUrl:
defaultZone: http://localhost:9020/eureka/
注意serviceUrl.defaultZone,这是个大坑,调试了好半天,按这个写就可以正常注册。
接下来就是启动生产者服务。启动之后,就会在注册中心看到一个 eruka-producer1的服务。
再复制一份producer模块 名称改为producer1,get方法返回改为“producer2”,这个就是为了区别服务调用的,还有就是改下port:9022,name和第一个生产者producer一致,启动后可以在注册中心看到一个服务有两个实例。
编写消费者consumer
添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
编写启动类
@EnableEurekaClient
@SpringBootApplication
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class);
System.out.println("启动成功!");
}
//还有其他方式调用服务 这里只是为了搭建eureka,所以不关心
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
}
编写一个controller 消费生产者
@RestController
public class Consumer {
@Autowired
RestTemplate restTemplate;
@GetMapping("/get")
public String get(){
return restTemplate.getForObject("http://ERUKA-PRODUCER1/get",String.class);
}
}
ERUKA-PRODUCER1这个是复制eureka控制台的,
添加application.yaml配置文件
server:
port: 9030
eureka:
client:
serviceUrl:
defaultZone: http://localhost:9020/eureka/
spring:
application:
name: consumer
启动consumer服务。在控制台可以看到 注册了一个服务,
在浏览器里调用接口 http:localhost:9030/get
到这里 一个服务的注册中心、生产者、消费者 已经搭建完毕,如果你起了两个生产者,那么重复调用接口会看到 输出在producer1、producer2间来回切换。
使用Feign消费
创建feign -demo
1、引入jar包
<!-- eureka连接-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- feign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-openfeign-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、创建启动类
@SpringBootApplication
@EnableFeignClients //声明可以feign连接
public class FeignApp {
public static void main(String[] args) {
SpringApplication.run(FeignApp.class);
System.out.println("启动成功!");
}
}
3、创建feign 接口
@FeignClient("eruka-producer1") //eruka-producer1 生产者服务名
public interface FeignCliet {
//需要通过feign调用的 rest接口 参数、返回值与rest接口一致
@RequestMapping(value = "/get",method = RequestMethod.GET,consumes = "application/json")
// @GetMapping("/get") //这样写也是可以调用的
String get();
}
4、controller demo
@RestController
public class FeignTest {
@Autowired
private FeignCliet feignCliet;
@GetMapping("/get")
public String get(){
return feignCliet.get();
}
}
配置类与上面的consumer一致即可 但注意端口号不要一致
spring:
application:
name: feignClientConSumer
eureka:
client:
serviceUrl:
defaultZone: http://localhost:9020/eureka/
server:
port: 9031
启动后浏览器访问
http://localhost:9031/get