1,在服务消费者的项目中引入依赖
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
主程序:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @ClassName: EurekaApp
* @Description:
* @author: liYue
* @date: 2021/6/15 16:37
*/
//启动之后,访问http://localhost:7001/
@EnableEurekaServer //服务端的启动类,可以接受别人注册进来
@SpringBootApplication
public class EurekaApp {
public static void main(String[] args) {
SpringApplication.run(EurekaApp.class,args);
}
}
2,配置类:
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;
/**
* @ClassName: ConfigBean
* @Description:
* @author: liYue
* @date: 2021/6/15 10:08
*/
@Configuration
public class ConfigBean {
// 配置负载均衡实现RestTemplate
@LoadBalanced //ribbon
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
3,写一个controller测试
public class DeptConsumerCont {
//消费者不应该有service
//RestTemplate 可以直接调用 先注册 到容器中
@Autowired
private RestTemplate restTemplate; //提供多种便捷访问远程HTTP服务的方法,简单的restful服务模板
// ribbon. 我们这里的地址,应该是一个变量,通过服务名来访问
// private static final String REST_URL_PREFIX="http://localhost:8001";
private static final String REST_URL_PREFIX="http://SPRING-CLOUD-PROVIDER-DEPT-8001";
// @RequestMapping("/consumer/dept/get/{id}")
// public Dept get(@PathVariable long id){
//
// return restTemplate.getForObject(REST_URL_PREFIX+"/test2/"+id, Dept.class);
//
// }
@RequestMapping("/getList")
@ResponseBody
public List<Dept> getList(){
//这里要把服务提供者的项目也启动,不然会报500
Dept[] forObject = restTemplate.getForObject(REST_URL_PREFIX + "/test", Dept[].class);
return Arrays.asList(forObject);
}
}
4,然后再yml配置eureka中配置注册中心的地址
port: 80
eureka:
client:
register-with-eureka: false #不向eureka服务注册自己
service-url:
defaultZone: http://localhost:7001/eureka/
5,eureka服务注册中心的项目中的配置
- 依赖
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
- yml
port: 7001
#Eureka
eureka:
instance:
hostname: localhost #Eureka服务端实例名称
client:
# register-with-eureka: false #表示是否eureka注册中心注册自己
fetch-registry: false #如果为false则表示自己为注册中心
service-url: #监控页面
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
- 主程序
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @ClassName: EurekaApp
* @Description:
* @author: liYue
* @date: 2021/6/15 16:37
*/
//启动之后,访问http://localhost:7001/
@EnableEurekaServer //服务端的启动类,可以接受别人注册进来
@SpringBootApplication
public class EurekaApp {
public static void main(String[] args) {
SpringApplication.run(EurekaApp.class,args);
}
}
6,随便写几个服务提供者的项目,为了模拟效果,大部分配置都是一样,每个服务连接的数据库都是不一样的
- 依赖
<!--完善监控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--加入eureka依赖-->
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!--我们需要拿到实体类,所以要配置api module-->
<dependency>
<groupId>com.ly</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--jetty-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<!--热部署工具-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
- cont
写两个接口供服务消费者远程调用---通过服务名调用,因为整合了ribbon的原因
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ly.pojo.Dept;
import com.ly.springcloud.dao.DaoDept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
/**
* @ClassName: DeptCont
* @Description:
* @author: liYue
* @date: 2021/6/14 23:15
*/
@Controller
public class DeptCont {
@Autowired
private DaoDept daoDept;
@ResponseBody
@GetMapping("/test")
public List<Dept> text(){
return daoDept.selectList(null);
}
@ResponseBody
@GetMapping("/test2/{id}")
public Dept text2(@PathVariable int id){
return daoDept.selectById(id);
}
}
- dao
简化操作用的mybatis-plus
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ly.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
/**
* @ClassName: DaoDept
* @Description:
* @author: liYue
* @date: 2021/6/14 23:17
*/
@Mapper
public interface DaoDept extends BaseMapper<Dept> {
}
- 主程序
主要是@EnableEurekaClient这个注解
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @ClassName: App
* @Description:
* @author: liYue
* @date: 2021/6/14 23:20
*/
@EnableEurekaClient //在服务启动后自动注册到Eureka中
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
- yml
因为多个服务提供者项目,所以每个项目的数据库是不一样的
除了url(spring.datasource.url),name(application.name)。其他 都可copy
port: 8001
mybatis:
type-aliases-package: com.ly.pojo
config-location: classpath:mybatis/mybatis-controller.xml
mapper-locations: classpath:mybatis/mapper/*.xml
~~~~
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/db01?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
username: root
password: 1234
application:
name: spring-cloud-provider-dept-8001
#Eureka的配置,服务注册到哪里
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
instance:
instance-id: springcloud-provider-dept8001 #修改eureka中的默认描述信息